gpt4 book ai didi

c# - Winforms DataBinding 与 PropertyChanged 事件排序问题

转载 作者:太空狗 更新时间:2023-10-29 21:46:30 25 4
gpt4 key购买 nike

如果之前有人问过这个问题,我很抱歉,但我确实尝试挖掘了大量可用的数据绑定(bind)问题,但找不到与我的问题相匹配的问题。

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

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

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

有什么方法可以数据绑定(bind)来解决这个问题吗?目前,每当我遇到这种情况时,我都不会使用数据绑定(bind),而是手动执行:

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

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

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


更新

我找到了解决方案。看起来 Binding 对象本身持有 BindingComplete 事件,这对这个来说是完美的。由于 DataBindings.Add 方法返回 Binding 对象,我可以将两者链接在一起。因此,我的代码变为:

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

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

最佳答案

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

关于c# - Winforms DataBinding 与 PropertyChanged 事件排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8721581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com