1

textBoxのデータをエントリにバインドしたいと思いDictionary<string,string>ます。私はデータバインディングを介してこれを達成しようとしているので、ユーザーがtextBoxを編集した後にコンテンツが更新されます。

これは私が行ったことのデモコードです:

Nameと辞書を持つclassA List

class ClassA
{
    public string Name { get; set; }
    public Dictionary<string, string> List { get; set; }

    public ClassA()
    {
        this.Name = "Hello";

        this.List = new Dictionary<string, string>
        {
            {"Item 1", "Content 1"},
            {"Item 2", "Content 2"}
        };
    }
}

フォームでは、私はにバインドtextBox1します:NametextBox2List["Item 1"]

ClassA temp = new ClassA();

public Form1()
{
    InitializeComponent();

    textBox1.DataBindings.Add("Text", temp, "Name");
    textBox2.DataBindings.Add("Text", temp.List["Item 1"], "");

    label1.DataBindings.Add("Text", temp, "Name");
}

private void textBox2_TextChanged(object sender, EventArgs e)
{
    label1.Text = temp.List["Item 1"];
}

textBox1テキストを変更すると、label1コンテンツ(Name)が正常に更新されます。

ただし、textBox2テキストを変更すると、label1コンテンツには元のList["Item 1"]値が表示されます。

どうすれば正しくバインドできtextBox2ますList["Item 1"]か?

4

1 に答える 1

2

明示的なバインディングを使用し、そのイベントを消費して目標を達成します

        Binding binding = new Binding("Text", temp, "List");
        binding.Parse += new ConvertEventHandler(binding_Parse);
        binding.Format += new ConvertEventHandler(binding_Format);
        textBox2.DataBindings.Add(binding); 

データバインドされたコントロールの値が変更されると、解析イベントが発生します。

    void binding_Parse(object sender, ConvertEventArgs e)
    {
        temp.List["Item 1"] = e.Value.ToString();
        label1.Text = temp.List["Item 1"]; 
    }

コントロールのプロパティがデータ値にバインドされると、フォーマットイベントが発生します。

    void binding_Format(object sender, ConvertEventArgs e)
    {
        if (e.Value is Dictionary<string, string>) 
        { 
            Dictionary<string, string> source = (Dictionary<string, string>)e.Value;
            e.Value = source["Item 1"];

        } 
    }
于 2012-10-01T07:08:55.273 に答える