【发布时间】: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