如何避免数据绑定中的大量通知

时间:2009-07-24 13:32:54

标签: data-binding batch-updates

我猜这是数据绑定方案中的一个常见问题。 如果您正在运行批量更新并希望避免对每次更新执行一次propertychanged-dependend计算/操作/执行的操作,您通常会做什么?

通常我想到的第一件事是要么引入一个新的布尔值,要么取消挂钩/挂钩事件处理程序,...

我不喜欢这种方法是:

  • 他们引入了新的复杂性(必须保持......)
  • 它们容易出错,因为您必须确保之后发送抑制通知

我想知道是否有人以更方便的方式解决了这个问题,而且更容易处理?

TIA 马丁

编辑:不要误会我。我知道.NET提供的东西,比如来自BindingList的RaiseListChangedEvents,......它们都在解决问题的方式与我描述的方式相同,但是我正在寻找一种不必列出缺点的不同方法。 也许我走错了路,但是我想在这里尝试一下......

3 个答案:

答案 0 :(得分:2)

遗憾的是,没有一种单一适用的解决方案。我已经应用或看到了以下解决方案:

  1. 有两个信号。当更改来自用户操作时会发出一个信号,另一个信号始终会触发。这允许区分UI中的更改和代码更新。

  2. 保护代码的布尔值

  3. 当值没有真正改变时,属性事件框架会自动停止传播事件。

  4. 信号或信号管理器(即整个框架)的冻/冻方法

  5. 将信号合并为单个信号的方法。你可以进行N次更新,并将它们收集到M个信号中,其中M <= N.如果你改变相同的属性100次,你仍然只能获得1个信号。

  6. 信号排队(而不是同步执行)。然后,排队代码也可以合并信号。在没有“保存”按钮的应用程序中,我已经非常成功地使用了它。所有更改都会在您创建时保存到数据库中。当您更改文本时,更改将在一定时间内合并(即直到上一次数据库更新返回),然后,它们将作为单个更改提交。

  7. 一次设置多个值的API;只发出一个信号。

  8. 信号框架可以发送不同粒度级别的信号。假设你有一个有名字的人。当您更改名称时,您会收到两个信号:一个用于更改名称,另一个用于“实例字段已更改”。因此,如果您只关心“有变化的东西”,那么您可以挂钩实例而不是所有字段。

答案 1 :(得分:1)

什么平台?这篇文章让我想到了.NET。

底层物品是什么?例如,BindingList<T>作为来源,您可以在执行更新时将RaiseListChangedEvents设置为false来禁用通知。

除此之外(或类似);是的,在大更新期间断开绑定

答案 2 :(得分:0)

最简单的方法是使用BindingSource组件进行数据绑定。不要将控件绑定到特定对象(或IList),而是将该对象用作DataSource的{​​{1}},然后将控件绑定到BindingSource

BindingSource班级有BindingSourceSuspendBinding()个功能。