誰かがBindableBaseがまだ実行可能かどうかを知っていますか、それともINotifyChangedイベントに固執する必要がありますか? BindableBaseはすぐに光沢を失ったようです。あなたが提供できる情報をありがとう。
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));
}
}
}
これら2つの間の選択ではありません。
BindableBaseはINotifyPropertyChangedを実装します。
したがって、BindableBaseを使用する場合は、INotifyPropertyChangedを使用します。
DataBindingを使用してMVVMを実装する場合、INotifyPropertyChangedは多かれ少なかれ必須です。
BindableBaseを使用するか、他の実装を使用するかは、Prismの設定と使用に依存します。
Rohitの答えを拡張するために、.NET 4.6を使用している場合は、Null条件演算子を利用して、OnPropertyChangedメソッドを次のように簡略化できます。
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
INotifyPropertyChanged、.NET 4.6の方法 で詳細に説明されています。