.Net Framework C# WPF プログラミング

WPF: INotifyPropertyChanged (実装サンプルあり)

2016年11月23日

INotifyPropertyChanged インターフェイスは、バインドデータがプログラム側で変更された際に、ユーザーインターフェイス(UI)にその変更を通知する仕組みを提供します。

バインディングソースに CLR オブジェクトを利用する際、バインディングターゲットの変更を通知するためには、INotifyPropertyChanged インターフェイスを実装します。なお、PropertyChanged イベントについてですが、オブジェクトが DataContext に設定されたタイミングで、WPF のデータバインディング機構が自動的に PropertyChanged イベントを登録します。

https://stackoverflow.com/a/7439445

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

サンプルアプリケーション

-.Net Framework, C#, WPF, プログラミング