INotifyPropertyChangedインタフェースの不思議
以前の日記に何度か、このインタフェースに言及したことがある。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しにくるかが全く解らないので、このままでは調べようが無いのだが..