BindableBase 与 INotifyChanged

BindableBase vs INotifyChanged

有谁知道 BindableBase 是否仍然可行,或者我们应该坚持使用 INotifyChanged 事件吗?看起来 BindableBase 很快就失去了光彩。感谢您提供的任何信息。

这两者不可取舍

BindableBase 实现 INotifyPropertyChanged。

因此,如果您使用 BindableBase,您将使用 INotifyPropertyChanged。

INotifyPropertyChanged 在使用 DataBinding 实现 MVVM 时或多或少是强制性的。

是否使用 BindableBase 或其他实现取决于 Prism 的偏好和使用。

INotifyPropertyChanged

ViewModel 应实现 INotifyPropertyChanged 接口,并应在属性更改时引发它

public class MyViewModel : INotifyPropertyChanged
{
    private string _firstName;


    public event PropertyChangedEventHandler PropertyChanged;

    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (_firstName == value)
                return;

            _firstName = value;
            PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
        }
    }


    }
}

问题出在 ICommand 接口上,因为大部分代码都是重复的,而且因为它传递字符串,所以很容易出错。

Bindablebase 是一个实现 INotifyPropertyChanged 接口并提供 SetProperty<T> 的抽象 class。您可以将设置方法减少到只有一行,也可以引用参数允许您更新它的值。下面的BindableBase代码来自INotifyPropertyChanged, The .NET 4.5 Way - Revisited

   public class MyViewModel : BindableBase
{
    private string _firstName;
    private string _lastName;

    public string FirstName
    {
        get { return _firstName; }
        set { SetProperty(ref _firstName, value); }
    }


}

     //Inside Bindable Base
    public abstract class BindableBase : INotifyPropertyChanged
    {

       public event PropertyChangedEventHandler PropertyChanged;

       protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)
       {
          if (Equals(storage, value))
          {
             return false;
          }

          storage = value;
          this.OnPropertyChanged(propertyName);
          return true;
       }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
      PropertyChangedEventHandler eventHandler = this.PropertyChanged;
      if (eventHandler != null)
      {
          eventHandler(this, new PropertyChangedEventArgs(propertyName));
      }
    }
}

为了扩展 Rohit 的回答,如果您使用的是 .NET 4.6,则可以利用 Null 条件运算符并按以下方式简化 OnPropertyChanged 方法:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

INotifyPropertyChanged, The .NET 4.6 Way 解释得更详细。