这里我说的是用C#编写的Windows Forms应用程序。考虑一个简单的模型
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
的{{1}}只包含一个DataRepeater
。
让我们专注于单向绑定,即我希望在用户更改文本框的内容时更新基础数据。 TextBox
的{{1}}属性以消息框的形式发出通知,因此我可以准确了解数据的更新时间。现在箭头代表绑定。蓝色箭头代表数据源,红色箭头代表数据成员。创建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
的成员会在相应的文本框失去焦点后更新整个编辑的块。
答案 0 :(得分:1)
我们能够通过模拟Tab键来克服DataRepeater的这种限制。
private void listedTextBox_TextChanged(object sender, EventArgs e)
{
//simulate tab key to force databinding
SendKeys.Send("{TAB}");
SendKeys.Send("+{TAB}");
}