这里我说的是用 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
's 列表。
现在我想向用户显示数据。这是我的设置:
主窗口有一个TextBox
用于显示SingularLabelled.Label
和一个DataRepeater
来自 Visual Basic PowerPacks 的用于显示ListedLabelled
. 的仅ItemTemplate
由DataRepeater
一个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
相应文本框失去焦点后更新整个编辑块的成员。