INotifyPropertyChanged 使用通用設定方法
下面的 NotifyPropertyChangedBase
class 定義了一個可以從任何派生型別呼叫的泛型 Set 方法。
public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
public event PropertyChangedEventHandler PropertyChanged;
public virtual bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (Equals(field, value))
return false;
storage = value;
RaisePropertyChanged(propertyName);
return true;
}
}
要使用此通用 Set 方法,只需建立一個派生自 NotifyPropertyChangedBase 的類。
public class SomeViewModel : NotifyPropertyChangedBase
{
private string _foo;
private int _bar;
public string Foo
{
get { return _foo; }
set { Set(ref _foo, value); }
}
public int Bar
{
get { return _bar; }
set { Set(ref _bar, value); }
}
}
如上所示,你可以在屬性的 setter 中呼叫 Set(ref _fieldName, value);
,如果需要,它將自動引發 PropertyChanged 事件。
然後,你可以從另一個需要處理屬性更改的類註冊到 PropertyChanged 事件。
public class SomeListener
{
public SomeListener()
{
_vm = new SomeViewModel();
_vm.PropertyChanged += OnViewModelPropertyChanged;
}
private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine($"Property {e.PropertyName} was changed.");
}
private readonly SomeViewModel _vm;
}