INotifyPropertyChanged インターフェイスは、バインドデータがプログラム側で変更された際に、ユーザーインターフェイス(UI)にその変更を通知する仕組みを提供します。
バインディングソースに CLR オブジェクトを利用する際、バインディングターゲットの変更を通知するためには、INotifyPropertyChanged インターフェイスを実装します。なお、PropertyChanged イベントについてですが、オブジェクトが DataContext に設定されたタイミングで、WPF のデータバインディング機構が自動的に PropertyChanged イベントを登録します。
INotifyPropertyChanged インターフェースの実装例
C# 6 で導入された Null 条件演算子を利用して OnPropertyChanged の実装を簡潔に記述することができるようになっています。
public class NotificationObject : INotifyPropertyChanged { /// <summary> /// プロパティ値の変更をクライアントに通知する。 /// </summary> public event PropertyChangedEventHandler PropertyChanged; /// <summary> /// PropertyChanged イベント を発生させる。 /// </summary> /// <param name="propertyName">変更されたプロパティ名</param> protected void OnPropertyChanged([CallerMemberName] string propertyName = "") { // C# 6 の Null 条件演算子を利用 this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); // C# 6 以前 //if (this.PropertyChanged != null) //{ // this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); //} } }
public class Product : NotificationObject { public Product() { } private string _name; public string Name { get { return _name; } set { _name = value; OnPropertyChanged(); } } }
値の変更は、次の様に行います。Name プロパティに値を設定したタイミングで呼び出される setter を経由して OnPropertyChanged メソッドが呼び出されることで、UI に変更通知がなされます。
private void Button_Click(object sender, RoutedEventArgs e) { var product = this.DataContext as Product; product.Name = "Orange"; }
参考情報
Null 条件演算子 (C# および Visual Basic)
https://msdn.microsoft.com/ja-jp/library/dn986595?f=255&MSPPError=-2147217396
How INotifyPropertyChanged's PropertyChanged event get assigned?
https://stackoverflow.com/a/7439445