ここでは、C# で記述された Windows フォーム アプリケーションについて説明します。単純なモデルを考える
class Labelled
{
private string label;
public string Label
{
get { return label; }
set
{
if (label != value)
{
string message = String.Format(
"Label changed from {0} to {1}",
label, value
);
MessageBox.Show(message);
label = value;
}
}
}
public Labelled(string label)
{
this.label = label;
}
}
class Model
{
public Labelled SingularLabelled { get; set; }
public List<Labelled> ListedLabelled { get; set; }
public Model()
{
SingularLabelled = new Labelled("Singular");
ListedLabelled = new List<Labelled>();
for (int i = 1; i <= 10; ++i)
ListedLabelled.Add(new Labelled("Listed " + i.ToString()));
}
}
Labelled
文字列プロパティを持つ単純なクラスと、型のメンバーを持つLabel
クラスがあり、これは のリストです。Model
SingularLabelled
Labelled
ListedLabelled
Labelled
次に、データをユーザーに表示したいと思います。これが私のセットアップです:
メイン ウィンドウには、TextBox
表示用SingularLabelled.Label
の とDataRepeater
、Visual Basic PowerPacks の要素のラベルを表示するための がありListedLabelled
ます。のItemTemplate
はDataRepeater
1 つの だけで構成されTextBox
ます。
一方向バインディングに焦点を当てましょう。つまり、ユーザーがテキスト ボックスの内容を変更したときに、基になるデータを更新したいと考えています。のLabel
プロパティはLabelled
、メッセージ ボックスの形式で通知を発生させるので、データがいつ更新されるかを正確に知ることができます。現在、矢印はバインディングを表しています。青い矢印はデータ ソースを表し、赤い矢印はデータ メンバーを表します。のインスタンスが作成され、メイン ウィンドウ フォームのコンストラクターで にModel
バインドされます。modelBindingSource
そして、ここで非常に重要なことに行き着きます。ユーザーが入力しているものと同期してデータをすぐに更新したいので、データ バインディングのデータ ソース更新モードが に設定されていることを確認しましたOnPropertyChanged
。ここで興味深いと思われる生成コードは次のとおりです。
this.singularTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.modelBindingSource, "SingularLabelled.Label", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.listedTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.listedLabelledBindingSource, "Label", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
これは、テキスト ボックスに入力するときに期待どおりに機能しますSingularLabelled
が、テキスト ボックス内のテキスト ボックスはDataRepeater
、フォーカスを失った場合にのみ更新をトリガーします。私は彼らが特異なもののように振る舞うことを望みます。理想的な解決策は、デザイナーを使用して行うことです。誰もこれを行う方法を知っていますか?
上記は、プログラムが動作するサンプルです。文字が入力されるたびに のラベルがどのように更新され、対応するテキスト ボックスがフォーカスを失った後、SingularLabelled
のメンバーが編集されたチャンク全体を更新するかに注目してください。ListedLabelled