2

我想这在数据绑定场景中是一个很常见的问题。如果您正在运行批量更新并希望避免每次更新都执行属性更改依赖计算/操作/任何内容,您通常会做什么?

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

我不喜欢这种方法的是:

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

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

蒂亚·马丁

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

4

3 回答 3

2

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

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

  2. 保护代码的布尔值

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

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

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

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

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

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

于 2009-07-24T13:44:11.187 回答
1

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

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

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

于 2009-07-24T13:37:46.127 回答
0

最简单的方法是使用该BindingSource组件进行数据绑定。与其将控件绑定到特定对象(或 IList),不如将该对象用作DataSourceBindingSource,然后将控件绑定到BindingSource.

该类BindingSource具有SuspendBinding()ResumeBinding()功能。

于 2009-07-24T13:44:40.453 回答