いつも調べちゃうのでメモ。
INotifyPropertyChangedを継承する
プロパティの変更通知をViewに反映するので,ViewModelに継承させることが多い。
場合によってはModelに継承させることもしばしば。
NugetからPrismパッケージをインストールして使用すると,次の見出しで説明するSetPropertyが標準で実装されているが,Nugetからインストールするのがめんどくさい。
実装する
OnProperty(string propertyName)の実装が基本だが,以下のようにSetPropertyメソッドを実装するほうが使い勝手がいい。
#region INotifyPropertyChanged Support public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } protected virtual bool SetProperty<T>(ref T field, T value, [CallerMemberName]string propertyName = null) { if (Equals(field, value)) { return false; } field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); return true; } #endregion INotifyPropertyChanged Support
使いかた
プロパティのsetterを以下のように記入して使う。
OnPropertyChangedの場合
OnPropertyChangedを呼び出して,Viewに変更通知を行う。
private string _displayText; public string DisplayText { get => _displayText; set { _displayText = value; OnPropertyChanged(nameof(DisplayText)); } }
SetPropertyの場合
SetPropertyを呼び出せば,プロパティの値変更と変更通知を同時にしてくれる。
private string _displayText; public string DisplayText { get => _displayText; set => SetProperty(ref _displayText, value); }