読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

コントロールの拡張クラスで実装されたプロパティに対してデータバインドを行う方法

C#

以下、ネタ元。

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 」は付けなくても大丈夫でした。……何故だろう?