mogmo .NET

C#/XAML/VB6たまにC++についてメモ程度に書いていく。あくまで自分用。責任は取れません。

INotifyPropertyChangedの実装

いつも調べちゃうのでメモ。

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); }