我猜这是数据绑定方案中的一个常见问题。 如果您正在运行批量更新并希望避免对每次更新执行一次propertychanged-dependend计算/操作/执行的操作,您通常会做什么?
通常我想到的第一件事是要么引入一个新的布尔值,要么取消挂钩/挂钩事件处理程序,...
我不喜欢这种方法是:
我想知道是否有人以更方便的方式解决了这个问题,而且更容易处理?
TIA 马丁
编辑:不要误会我。我知道.NET提供的东西,比如来自BindingList的RaiseListChangedEvents,......它们都在解决问题的方式与我描述的方式相同,但是我正在寻找一种不必列出缺点的不同方法。 也许我走错了路,但是我想在这里尝试一下......答案 0 :(得分:2)
遗憾的是,没有一种单一适用的解决方案。我已经应用或看到了以下解决方案:
有两个信号。当更改来自用户操作时会发出一个信号,另一个信号始终会触发。这允许区分UI中的更改和代码更新。
保护代码的布尔值
当值没有真正改变时,属性事件框架会自动停止传播事件。
信号或信号管理器(即整个框架)的冻/冻方法
将信号合并为单个信号的方法。你可以进行N次更新,并将它们收集到M个信号中,其中M <= N.如果你改变相同的属性100次,你仍然只能获得1个信号。
信号排队(而不是同步执行)。然后,排队代码也可以合并信号。在没有“保存”按钮的应用程序中,我已经非常成功地使用了它。所有更改都会在您创建时保存到数据库中。当您更改文本时,更改将在一定时间内合并(即直到上一次数据库更新返回),然后,它们将作为单个更改提交。
一次设置多个值的API;只发出一个信号。
信号框架可以发送不同粒度级别的信号。假设你有一个有名字的人。当您更改名称时,您会收到两个信号:一个用于更改名称,另一个用于“实例字段已更改”。因此,如果您只关心“有变化的东西”,那么您可以挂钩实例而不是所有字段。
答案 1 :(得分:1)
什么平台?这篇文章让我想到了.NET。
底层物品是什么?例如,BindingList<T>
作为来源,您可以在执行更新时将RaiseListChangedEvents
设置为false来禁用通知。
除此之外(或类似);是的,在大更新期间断开绑定
答案 2 :(得分:0)
最简单的方法是使用BindingSource
组件进行数据绑定。不要将控件绑定到特定对象(或IList),而是将该对象用作DataSource
的{{1}},然后将控件绑定到BindingSource
。
BindingSource
班级有BindingSource
和SuspendBinding()
个功能。