【问题标题】:Triggering an event handler after a DataBinding update在 DataBinding 更新后触发事件处理程序
【发布时间】:2015-10-01 22:22:44
【问题描述】:

我有一个绑定到 ComboBox 的数据对象,当该 ComboBox 中的选定值发生更改时,我想更新数据对象,然后刷新对象绑定到的数据网格。

我遇到的问题是,据我所知,我附加的事件处理程序在数据对象更新之前触发,因此当我的数据网格刷新时它仍然包含旧的 ComboBox 值。

这是我的 ComboBox 控件初始化:

    cmbPaymentType.DataSource = _paymentTypes
    cmbPaymentType.DisplayMember = "PaymentTypeName"
    cmbPaymentType.DataBindings.Add("SelectedItem", _data, "PaymentType", False, DataSourceUpdateMode.OnPropertyChanged)

    cmbPaymentType.Refresh()

    AddHandler cmbPaymentType.DropDownClosed, AddressOf _data.NotifyDataChanged

当 NotifyDataChanged 被触发时,使用我的数据对象_data 的数据网格被刷新,但是 PaymentType 的值没有被更新。如果我之后从其他地方触发 NotifyDataChanged,数据网格会更新为选定的组合框值,这表明数据对象绑定有效,它只是在我的应用程序流程中绑定得太晚了。

在数据绑定更新后如何触发事件?

谢谢!

编辑:数据对象_data 是一个自动生成的实体框架类,其中附有我编写的部分类。如果我要使用INotifyPropertyChanged 接口,我不知道如何覆盖自动生成的属性以正确实现它。

@Fabio 下面的解决方案通过在组合框选择更改时手动更新数据绑定解决了我的问题,这意味着我的事件处理可以在之后进行,并且数据对象将在数据网格刷新之前更新。我稍微调整了他的函数,以便在任何控件上使用第一个数据绑定:

Private Sub bindingUpdate(sender As Object, e As EventArgs)
    DirectCast(sender, Control).DataBindings(0).WriteValue()
    _data.NotifyDataChanged(sender, e)
End Sub

【问题讨论】:

  • SelectedIndexChanged、Leave 等各种事件都具有相同的效果;它们在绑定更新之前触发

标签: .net vb.net winforms


【解决方案1】:

您的问题是绑定到SelectedItem。
正如@Charlie 在 cmets 中注意到的那样,只有在 ComboBox 失去焦点后,才会更新有界项的属性(在绑定到 SelectedItem 的情况下)。

因为你想绑定到对象,而不是对象的属性,最简单的方法是手动发送关于更新值的消息
为SelectionChangesCommitted 事件创建处理程序,当SelectedItem 更改时触发

Private Sub cmbPaymentType_SelectionChangesCommitted(sender As Object, e As EventArgs)
    DirectCast(sender, ComboBox).Bindings("SelectedItem").WriteValue()
    'Here you can update datagrid too
End Sub

另一种方法是对SelectedValue 使用DataBinding。然后你需要设置一个ComboBox.ValueMember

cmbPaymentType.DisplayMember = "PaymentTypeName"
cmbPaymentType.ValueMember = "PaymentTypeID"
cmbPaymentType.DataSource = _paymentTypes

cmbPaymentType.DataBindings.Add("SelectedValue", _data, "PaymentTypeID", False, DataSourceUpdateMode.OnPropertyChanged)

【讨论】:

  • 是否有一个组合框属性会引发数据绑定事件?
  • 谢谢,您提出的第一个解决方案非常有效。
  • 我可能是错的,但根据这个答案 SelectedItem 确实会引发数据绑定事件,直到控件失去焦点stackoverflow.com/questions/2883481/…
【解决方案2】:

我有点困惑,但听起来这就是你要问的:

  1. 您有一个 Enumerable _data,其中包含您已绑定到 DataGridView (DGV) 的数据库中的多行。

  2. 您想使用 DGV 中的控件 not 更新 DGV 中的单个行。

这很不寻常。如果您的 ComboBox 是 DGV 中的一个单元格,那么您所要做的就是处理 CellValueChanged 事件,一切都会正常工作。

话虽如此,您可以让 ComboBox SelectedValue 事件更新单元格值,然后触发 CellValueChanged。

【讨论】:

  • 不幸的是,UI 设计超出了我的控制范围。您提出的解决方案是一种非常迂回的做事方式,我更愿意直接更新数据对象作为它在整个应用程序中使用的状态。
  • 我不同意。根据链接以这种方式立即更新您的 UI 对于某些应用程序来说是一种有效的方法。显然它不适合你,但这并不意味着这是一种错误的方法。 stackoverflow.com/questions/2883481/…
猜你喜欢
  • 2013-11-23
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多