如何使Microsoft.VisualBasic.PowerPacks.DataRepeater立即更新绑定数据?

时间:2013-06-02 23:13:36

标签: c# winforms data-binding datarepeater

这里我说的是用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的类型为LabelledListedLabelledLabelled的列表。

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

Main window and data bindings

主窗口有TextBox用于显示SingularLabelled.LabelDataRepeater来自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 label update

ListedLabelled label update

以上是该计划的一个示例。请注意每个放入的字符后SingularLabelled的标签是如何更新的,DataRepeater的成员会在相应的文本框失去焦点后更新整个编辑的块。

1 个答案:

答案 0 :(得分:1)

我们能够通过模拟Tab键来克服DataRepeater的这种限制。

    private void listedTextBox_TextChanged(object sender, EventArgs e)
    {
        //simulate tab key to force databinding
        SendKeys.Send("{TAB}");
        SendKeys.Send("+{TAB}");
    }