web-dev-qa-db-ja.com

BindableBaseとINotifyChanged

誰かがBindableBaseがまだ実行可能かどうかを知っていますか、それともINotifyChangedイベントに固執する必要がありますか? BindableBaseはすぐに光沢を失ったようです。あなたが提供できる情報をありがとう。

13
ChiliYago

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>を提供する抽象クラスです。setメソッドを1行に減らすこともできます。refパラメータでも許可されますその値を更新します。以下のBindableBaseコードは INotifyPropertyChanged、.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));
      }
    }
}
27
Rohit

これら2つの間の選択ではありません。

BindableBaseはINotifyPropertyChangedを実装します。

したがって、BindableBaseを使用する場合は、INotifyPropertyChangedを使用します。

DataBindingを使用してMVVMを実装する場合、INotifyPropertyChangedは多かれ少なかれ必須です。

BindableBaseを使用するか、他の実装を使用するかは、Prismの設定と使用に依存します。

6
Erno

Rohitの答えを拡張するために、.NET 4.6を使用している場合は、Null条件演算子を利用して、OnPropertyChangedメソッドを次のように簡略化できます。

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

INotifyPropertyChanged、.NET 4.6の方法 で詳細に説明されています。