0

ここでは、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クラスがあり、これは のリストです。ModelSingularLabelledLabelledListedLabelledLabelled

次に、データをユーザーに表示したいと思います。これが私のセットアップです:

メイン ウィンドウとデータ バインディング

メイン ウィンドウには、TextBox表示用SingularLabelled.Labelの とDataRepeater、Visual Basic PowerPacks の要素のラベルを表示するための がありListedLabelledます。のItemTemplateDataRepeater1 つの だけで構成され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、フォーカスを失った場合にのみ更新をトリガーします。私は彼らが特異なもののように振る舞うことを望みます。理想的な解決策は、デザイナーを使用して行うことです。誰もこれを行う方法を知っていますか?

SingularLabeled ラベルの更新

ListedLabeled ラベルの更新

上記は、プログラムが動作するサンプルです。文字が入力されるたびに のラベルがどのように更新され、対応するテキスト ボックスがフォーカスを失った後、SingularLabelledのメンバーが編集されたチャンク全体を更新するかに注目してください。ListedLabelled

4

1 に答える 1

1

Tab キーをシミュレートすることで、DataRepeater のこの制限を克服することができました。

    private void listedTextBox_TextChanged(object sender, EventArgs e)
    {
        //simulate tab key to force databinding
        SendKeys.Send("{TAB}");
        SendKeys.Send("+{TAB}");
    }
于 2013-06-03T05:22:01.313 に答える