【问题标题】:Data-bound combobox not updating its datasource on SelectedItem数据绑定组合框未在 SelectedItem 上更新其数据源
【发布时间】:2017-01-05 08:45:48
【问题描述】:

我有一个数据绑定组合框。绑定如下:

cbo.DataBindings.Add(new Binding("SelectedItem", this.bindingSource, "Order", true, DataSourceUpdateMode.OnPropertyChanged, null));

它的填充如下:

cbo.DataSource = customer.Orders.Where(x => x.Month == month).ToList();
cbo.ValueMember = "OrderId";
cbo.DisplayMember = "OrderDate";
cbo.SelectedIndex = -1;

数据源是一个BindingSource,它又绑定到一个 DTO 类。

如果我使用TAB 选择一个项目并将焦点移动到另一个控件,则SelectedItem 设置正确。

但是,如果我选择一个项目并单击另一个控件,则在退出控件时,SelectedItem 将是先前选择的项目。

我尝试过结合SelectedItem、SelectedValue、OnPropertyChanged 和OnValidation,但如果不使用标签,都会导致同样的问题。

SO answer 中提供了部分解决方案,但在我的情况下,它不起作用。

目前的解决方法是:

(bindingSource.Current as Customer).Order = selectedOrder;

这应该是不必要的,因为数据源是绑定的。有没有更好的方法来强制在单击另一个控件而不是跳出时提交更改?

【问题讨论】:

    标签: c# winforms data-binding


    【解决方案1】:

    问题在于ComboBox 没有提供正确绑定到SelectedItem 所需的SelectedItemChanged 事件。

    您应该改为绑定到SelectedValue,这样可以正常工作。问题是没有办法指定使用DisplayMember作为显示和数据源对象作为ValueMember。解决它的一种方法是对列表元素使用专门的对象(也称为视图模型)。例如,使用匿名类型投影:

    cbo.DisplayMember = "OrderDate";
    cbo.ValueMember = "Order";
    cbo.DataSource = customer.Orders.Where(x => x.Month == month)
        .Select(o => new { o.OrderDate, Order = o })
        .ToList();
    
    cbo.DataBindings.Add(new Binding("SelectedValue", bindingSource, "Order", true, DataSourceUpdateMode.OnPropertyChanged, null));
    

    【讨论】:

      【解决方案2】:

      理论上,当控件失去焦点时,“OnPropertyChanged”将强制数据绑定将值写入底层对象。但不知何故它没有;所以我猜某处数据绑定没有正确完成:

      1. 数据绑定是否绑定到正确的对象?

      2. 改变绑定对象时是否清除了之前的数据绑定?

      3. 您是否尝试将 this.bindingSource 直接更改为您的对象,而不是通过 bindingSource 包装器?

      通常,如果您希望强制将数据写回对象以进行数据绑定,您可以调用 binding.WriteValue()。

      如下所示:

          cbo.LostFocus += (object sender, EventArgs e) => {
              foreach (Binding b in cbo.DataBindings)
              {
                  if (string.Equals(b.PropertyName, "SelectedItem"))
                  {
                      b.WriteValue();
                  }                    
              }
          };
      

      【讨论】:

        猜你喜欢
        • 2011-06-28
        • 2021-07-23
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多