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