【问题标题】:Winforms DataBinding vs PropertyChanged Event Ordering IssueWinforms DataBinding 与 PropertyChanged 事件排序问题
【发布时间】:2012-01-04 03:11:45
【问题描述】:

很抱歉,如果以前有人问过这个问题,但我确实尝试过挖掘大量可用的 DataBinding 问题,但找不到与我的问题相匹配的问题。

我正在列表框索引和我的一个实体上的某些属性之间进行单向数据绑定,但是我还需要在数据绑定之后运行一些额外的逻辑地方。我试过这样做:

listBox.DataBindings.Add("SelectedIndex", entity, "Property", true, DataSourceUpdateMode.OnPropertyChanged);
listBox.SelectedIndexChanged += (s,e) => view.Refresh();

问题在于事件处理程序在数据绑定更新之前运行,但view.Refresh() 取决于entity.Property 的值被更新。这导致我的视​​图在下次更改索引时才会刷新。

有没有办法解决这个with 数据绑定?目前,每当遇到这种情况时,我都会不使用数据绑定,而是手动进行:

listBox.SelectedIndex = entity.Property;
listBox.SelectedIndexChanged += OnIndexChanged;

private void OnIndexChanged(object sender, EventArgs e)
{
    entity.Property = listBox.SelectedIndex;
    view.Refresh();
}

但我宁愿避免这种情况,因为我对其他所有事情都使用数据绑定并且希望保持一致性。


更新

我找到了解决方案。看起来 Binding 对象本身包含非常适合此的 BindingComplete 事件。由于 DataBindings.Add 方法返回给我的 Binding 对象,我可以将两者链接在一起。因此,我的代码变为:

listBox.DataBindings.Add("SelectedIndex", entity, "Property", true, DataSourceUpdateMode.OnPropertyChanged).BindingComplete += (s,e) => view.Refresh();

我现在唯一的问题是是否需要手动取消注册此事件,或者我是否可以致电 listBox.DataBindings.Clear(); 并完成它。

【问题讨论】:

  • 你试过SelectedValueChanged事件吗?它可能会在绑定后触发事件。
  • 我有,结果相似。我相信所有 (*)Changed 事件都会在绑定之前触发。
  • 您总是可以将您的事件放在数据源更改事件上。如果您需要帮助,只需发布​​您的数据源代码。
  • 我已经对此进行了一些测试,但 DataSourceChanged 事件仅在我第一次实际设置时调用 (listBox.DataSource = stringList),而不是在数据绑定发生时调用。
  • 哦,我好像找到了办法。我会更新我的帖子。

标签: c# winforms events data-binding


【解决方案1】:

您使用的方法返回一个Binding 的实例。为什么不听返回绑定的BindingComplete 事件并从那里调用Refresh 方法呢?代码可能需要评估 BindingCompleteContext Exception 等字段,以确保在数据源更改时触发事件。您无需调用 listBox.DataBindings.Clear()。释放控件时,绑定将被删除。您通常不需要手动注销事件,我认为在您的情况下,您不需要手动注销事件。

【讨论】:

  • 谢谢,实际上我也注意到了这一点。我已经更新了我的帖子,但我还有一个问题,我将其添加到最后。
猜你喜欢
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2011-07-01
  • 2015-04-12
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多