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具有字符串属性的简单类LabelModel具有类型成员SingularLabelled的类LabelledListedLabelled它是一个Labelled's 列表。

现在我想向用户显示数据。这是我的设置:

主窗口和数据绑定

主窗口有一个TextBox用于显示SingularLabelled.Label和一个DataRepeater来自 Visual Basic PowerPacks 的用于显示ListedLabelled. 的仅ItemTemplateDataRepeater一个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 回答