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

Data binding 如何避免数据绑定中的大量通知,data-binding,batch-updates,Data Binding,Batch Updates,我想这是数据绑定场景中很常见的问题。 如果您正在运行批处理更新,并且希望避免每次更新都执行propertychanged依赖的计算/操作/任何操作,您通常会怎么做 我通常想到的第一件事是,要么引入一个新的布尔值,要么取消对eventhandler的hook/hook 我不喜欢这种方法的原因是: 它们引入了新的复杂性(必须保持…) 它们很容易出错,因为您必须确保随后发送禁止的通知 我想知道是否有人已经用一种更方便、更容易处理的方式解决了这个问题 短暂性脑缺血发作 马丁 编辑:不要误解我。我知道

我想这是数据绑定场景中很常见的问题。 如果您正在运行批处理更新,并且希望避免每次更新都执行propertychanged依赖的计算/操作/任何操作,您通常会怎么做

我通常想到的第一件事是,要么引入一个新的布尔值,要么取消对eventhandler的hook/hook

我不喜欢这种方法的原因是:

  • 它们引入了新的复杂性(必须保持…)
  • 它们很容易出错,因为您必须确保随后发送禁止的通知
我想知道是否有人已经用一种更方便、更容易处理的方式解决了这个问题

短暂性脑缺血发作 马丁

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

什么平台?这篇帖子让我想到了.NET

底层对象是什么?例如,
BindingList
作为源允许您在执行更新时通过将
RaiseListChangedEvents
设置为false来禁用通知


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

不幸的是,没有一个一刀切的解决方案。我已经应用或看到了以下解决方案:

  • 有两个信号。一个信号在来自用户操作的更改时发出,另一个总是激发。这允许通过代码区分UI中的更改和更新

  • 保护代码的布尔值

  • 属性事件框架在值没有真正更改时自动停止传播事件

  • 信号或信号管理器(即整个框架)上的冻结/解冻方法


  • 将信号合并成单个信号的一种方法。您可以执行N次更新,它们被收集到M个信号中,其中M最简单的方法是使用
    BindingSource
    组件进行数据绑定。不要将控件绑定到特定对象(或IList),而是将该对象用作
    BindingSource
    DataSource
    ,然后将控件绑定到
    BindingSource


    BindingSource
    类具有
    SuspendBinding()
    ResumeBinding()
    函数。

    是的,我说的是.NET,它与底层对象无关,因为我使用RaiseListChangedEvents或者我自己实现类似的东西。但我不确定这两种方法是否都是解决此问题的最佳“可用”方法…这只会帮助避免不必要的UI更新,但是它不会阻止ViewModels中代码的执行,特别是当它们是主细节并且主细节侦听来自细节的事件时。在这种情况下,唯一真正的方法必须是首先防止对象引发事件。不可能有一个通用的解决方案。