WPF: INotifyPropertyChanged (実装サンプルあり)
📋 目次(クリックで展開)
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
サンプルアプリケーション
INotifyPropertyChanged_Test.zip
💬 コメント