コントロールの拡張クラスで実装されたプロパティに対してデータバインドを行う方法
以下、ネタ元。
- (R.Tanaka.Ichiro's Blog)
- データバインディングのおべんきょ。 その1 その2 その3 その4 その5 http://blogs.wankuma.com/torikobito/archive/2007/05/30/78833.aspx:title=その6] その7 その8 その9 その10 その11 その12 その13 (とりこらぼ。)
R・田中一郎さんの記事を見て手元で検証してみようとしたところで、そもそもデータバインドについてよく判っていなかったので、とりこびとさんの記事を元にお勉強しつつ見てみました。
……で、結論から言うと、「データソース→プロパティ」と同じ事を「プロパティ→データソース」でも実装してあげれば良いみたいです。
以下、一応サンプルソース。(あえて INotifyPropertyChanged の実装版にしてみる)
public class MyTextBox : TextBox, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string _value; public string Value { get { return this._value; } set { if (this._value == value) { return; } this._value = value; NotifyPropertyChanged("Value"); } } private void NotifyPropertyChanged(string name) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(name)); } } }
……まぁ、よく考えてみればその通りなのですが。
ちなみに、 TextBox のプロパティでも、 Text や TextAlign などは「プロパティ名+ 'Changed' 」なイベントが公開されているのでデータバインド可能ですが、 PasswordChar の様に Changed イベントが公開されていないものはデータバインド出来ない様です。
つまり、「プロパティ→データソース」についても、同じ仕組みでデータバインドが行われているだけと云うオチ。(そもそもこれに気づいたので上の結論を出せたと云う。。。)
なお、R・田中一郎さんの記事へのえムナウさんのコメントにある「 BindableAttribute 」は付けなくても大丈夫でした。……何故だろう?