代码之家  ›  专栏  ›  技术社区  ›  Martin Moser

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

  •  2
  • Martin Moser  · 技术社区  · 16 年前

    我想这是数据绑定场景中的一个常见问题。 如果您正在运行批更新,并且希望避免对每个更新执行propertychanged dependend calculations/actions/whatever,您通常会怎么做?

    我通常会想到的第一件事是,要么引入一个新的布尔值,要么解开/钩住事件处理程序……

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

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

    我想知道是否有人已经用一种更容易处理的更方便的方式来解决这个问题了?

    蒂亚 马丁

    编辑:不要误解我。我知道.NET提供的东西,比如bindingList中的raiseListChangedEvents,…他们都以我描述的方式或多或少地解决了这个问题,但我正在寻找一种不必列出缺点的不同方式。 也许我走错了路,但我想试试看……

    3 回复  |  直到 16 年前
        1
  •  2
  •   Aaron Digulla    16 年前

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

    1. 有两个信号。当更改来自用户操作时,一个信号发出,另一个总是激发。这允许按代码区分用户界面中的更改和更新。

    2. 保护代码的布尔值

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

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

    5. 把信号合并成单个信号的一种方法。您可以进行n次更新,并将它们收集到m信号中,其中m<=n。如果对同一属性进行100次更改,则仍然只能获得1个信号。

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

    7. 一种API,一次设置几个值;只发出一个信号。

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

        2
  •  1
  •   Marc Gravell    16 年前

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

    什么是底层对象?例如, BindingList<T> 作为源,您可以通过设置 RaiseListChangedEvents 执行更新时出错。

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

        3
  •  0
  •   Adam Robinson    16 年前

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

    这个 绑定源 班有 SuspendBinding() ResumeBinding() 功能。