.net の Windows フォームでは、UI とオブジェクトを結びつける (Mac でいうと Cocoa バインディングかな ?) 機能がサポートされています。 ここでは、実際にテキストボックスとその値を管理するオブジェクトとを 結び付けてみます。これにより、テキストボックスの値をユーザが更新すると、 オブジェクトのボックスが自動的に書き換えられます。 逆にオブジェクトの値を更新すると、テキストボックスが更新されます。
まず、データを管理するクラスを定義します。 以下に単純な文字列プロパティを一つ持つクラス DataHolder を定義します。
ref class DataHolder { public: DataHolder(void) {} public: virtual ~DataHolder(void) {} event EventHandler^ TestTextChanged; private: String^ testTextValue; public: property String^ TestText { void set(String^ value) { this->testTextValue = value; TestTextChanged(this, gcnew EventArgs() ); } String^ get() { return testTextValue; } } };
TestText
プロパティがテキストボックスとバインドする値です。
重要なのは、イベントハンドラを用意しておくことです。
イベントハンドラは、プロパティ名に "Changed"
をつなげた名前でなくてはなりません。
推測ですが、内部的にリフレクションで実現されているのでしょう。
setter 関数はイベントを送出するように実装しておきます。
これで、プロパティが変更されたときに、以下のバインディングがなされていれば、 テキストボックスが変更通知を受けて値を変更します。
次にテキストボックスとプロパティを関連付けます。 テキストボックスとデータ管理クラスが以下のように定義されているとします。
TextBox^ textBox1 = gcnew TextBox(); DataHolder^ holder = gcnew DataHolder();
テキストボックスには Text
プロパティの値を表示されます。
したがって、このプロパティと先ほどの DataHolder の TestText
プロパティをバインディングします。
これで、完了です。 データ管理クラスのプロパティとテキストボックスのプロパティが連動します。 いかにも、リフレクションで実現してそうです。