以前の日記に何度か、このインタフェースに言及したことがある。INotifyPropertyChangedは、NET 2.0 WindowsFormsにおけるカスタムオブジェクトとコントロールの双方向データ連結に使用するインタフェースである。
例として、ユーザ定義のクラスとコントロールを次のように単純に連結していたとしよう。
form1.bindingSource = new BindingSource();
form1.bindingSource.DataSource = typeOf(Hoge);
form1.textBox1.DataBindings.Add("Text", form1.bindingSource, "Name");
この時、Hogeクラスで、以下のようにINotifyPropertyChangedインタフェースを実装しておくと
public class Hoge : INotifyPropertyChanged
{
private string name;
public event PropertyChangedEventHandler PropertyChanged;
public virtual void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public string Name
{
get { return this.name; }
set
{
if ( this.name != value )
{
this.name = value;
NotifyPropertyChanged("Name");
}
}
}
}
このクラスのインスタンスでNameプロパティを変更した際に、データ連結先のコントロール(サンプルではform1.textBox1)のTextプロパティが自動的に更新される(双方向データ連結)される、というおいしい機能なのだが、組み方によってはPropertyChangedがnullでプロパティの変更が反映されないケースがある。インスタンスをBindingSourceにAddすると正常に動作するので、データ連結の初期化に失敗しているようだ。
そもそも、誰が(何のクラスが)カスタムオブジェクトのPropertyChangedEventHandler型のイベントを、何時Addしにくるかが全く解らないので、このままでは調べようが無いのだが..