2009-07-24 55 views
2

我想这在数据绑定场景中是一个相当常见的问题。 如果您正在运行批处理更新并希望避免一个属性changedchanged-dependend calculate/actions /为每个更新执行什么,您通常会做什么?如何避免DataBinding中的大量通知

通常我想到的第一件事,就是无论是引入了一个新的布尔或脱钩/挂钩的事件处理程序,...

我不喜欢这个方法是:

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

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

TIA 马丁

编辑:不要missunderstand我。我知道.NET提供的东西像来自BindingList的RaiseListChangedEvents,......它们都是按照我所描述的方式以更多/更少的方式解决问题,但我正在寻找一种不需要列出缺点的不同方式。 也许我在错误的轨道上,但我虽然在这里试试看...

回答

2

不幸的是,没有一种适合所有人的解决方案。我已经申请或看到以下解决方案:

  1. 有两个信号。当用户操作发生变化时,会发出一个信号,另一个信号会一直发射。这允许区分UI中的更改和代码更新。

  2. 一个布尔值,为保护代码

  3. 财产事件框架自动停止传播事件,当值并没有真正改变。

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

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

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

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

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

1

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

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

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

+0

是的我正在谈论.NET,因为我使用RaiseListChangedEvents或者我自己实现了类似的东西,所以它不依赖于底层对象。但我不确定两者是否真的是解决此问题的最佳“可用”方法...... – 2009-07-24 13:40:38

0

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

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

+0

这有助于避免不必要的UI更新,但它并不妨碍ViewModels中代码的执行,特别是如果它们是Master - 详细信息和大师倾听来自细节的事件 – 2009-07-24 13:47:05