データバインド
DIコンテナと+AOPを使って.NETのデータバインドを今よりも楽にするための方法をいろいろと検討している。データバインド自体、あまり明るくないのだが、参考にしている資料の中で、以前にCodeZineでも紹介された(今はもう消えてるみたい)、この記事
シングルインスタンスを Windows フォームにデータバインドする方法 元記事 -> Custom Object Data Binding with .NET
の「コントロールのプロパティとデータソースのプロパティとの間でバインディングを定義すると、データバインディング機能は自動的にデータソース上で「プロパティ名+Changed」という名前のイベントを探します。」というメカニズムが内部でどのように実装されているのかが解らない。確かにTextBoxのTextプロパティ(オブジェクトにバインドされている)を変更して、コントロールからフォーカスが抜けるとそのプロパティのセッタメソッドに飛んでくるのはデバッガでも確認できるんだけれど、気になるのはその前にこっそりやっている部分。どこかで詳細に言及した記事を見た気がしたのだけれど思い出せない。
と思ったのだが、別に難しい話ではなくオブジェクトとコントロールをバインドするためには、単にそのオブジェクトのプロパティをバインドすれば良いはず。
public class BindTarget { private string data; public string Data { get { return this.data; } set { this.data = value; } } } BindTarget target = new BindTarget(); //Textboxにバインド form1.textBox1.DataBindings.Add("Text", target, "Data");
これで上手くいかなかったので、何か隠された謎があると思ったのだが、そうではなく自分で用意したコントロールのバリデートイベントが発生していないだけのようだ。そう、オブジェクトにバインドしたコントロールがオブジェクトに値を書き戻すタイミングのデフォルトはバリデート時(OnValidation)なのだった。
試しに、このタイミングを制御するプロパティ、DataBindings.DataSourceUpdateModeプロパティをOnPropertyChangedにするとあっさり動いたし。