【问题标题】:Data binding for TextBoxTextBox 的数据绑定
【发布时间】:2010-12-09 14:47:03
【问题描述】:

我有一个存储 Fruit 类型对象的基本属性:

Fruit food;
public Fruit Food
{
    get {return this.food;}
    set
    {
        this.food= value;
        this.RefreshDataBindings();
    }
}

public void RefreshDataBindings()
{
    this.textBox.DataBindings.Clear();
    this.textBox.DataBindings.Add("Text", this.Food, "Name");
}

所以我在表单之外设置了this.Food,然后它会显示在 UI 中。

如果我修改this.Food,它会正确更新。如果我以编程方式修改 UI,例如:

this.textBox.Text = "NewFruit",它不会更新 this.Food。

为什么会这样?我还为 Fruit.Name 实现了INotifyPropertyChanged,但还是一样。

【问题讨论】:

    标签: c# .net winforms data-binding


    【解决方案1】:

    我们可以使用下面的代码

    textBox1.DataBindings.Add("Text", model, "Name", false, DataSourceUpdateMode.OnPropertyChanged);
    

    在哪里

    • "Text" – 文本框的属性
    • model – 模型对象在此处输入代码
    • "Name" – 绑定文本框的模型值。

    【讨论】:

      【解决方案2】:

      我建议您实现 INotifyPropertyChanged 并将您的数据绑定代码更改为:

      this.textBox.DataBindings.Add("Text",
                                      this.Food,
                                      "Name",
                                      false,
                                      DataSourceUpdateMode.OnPropertyChanged);
      

      这样就解决了。

      请注意,默认的DataSourceUpdateModeOnValidation,因此如果您不指定OnPropertyChanged,则模型对象将在您进行验证之前不会更新。

      【讨论】:

        【解决方案3】:

        您需要一个 bindingsource 对象来充当中介并协助绑定。然后更新下划线模型,而不是更新用户界面。

        var model = (Fruit) bindingSource1.DataSource;
        
        model.FruitType = "oranges";
        
        bindingSource.ResetBindings();
        

        阅读 BindingSource 和 Windows Forms 的简单数据绑定。

        【讨论】:

          【解决方案4】:

          您不能将数据绑定到属性,然后显式地为数据绑定的属性赋值。

          【讨论】:

          • 谢谢,但是为什么这不可能呢?我以为是 2 路?
          • Joan,这是 WPF 中的(大大改进的)绑定。 WinForms 比较简单。
          • 谢谢 Henk,你知道如何在 Winforms 中实现这一点吗?不幸的是,我不能在这个项目中使用 wpf。
          • 我相信这个答案的情绪是,“你不能简单地将数据绑定到一个属性,然后显式地为数据绑定的属性分配一个值并让绑定更新控件”,但措辞有点误导。最后,您可以更新属性,并且您可以以更新控件的方式实现绑定(请参阅接受的答案)。
          猜你喜欢
          • 2016-06-26
          • 1970-01-01
          • 2021-09-09
          • 1970-01-01
          • 2014-10-21
          • 2019-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多