CollectionView.DeferRefresh()抛出异常

Hou*_*man 8 c# exception icollectionview deferred

有些情况下,由于大量的INotifyChangedProperties事件,您有许多UI更新.在这种情况下,您可能只想在批量设置所有属性时仅向UI发出一次更改信号.

我发现这篇很棒的文章解释了如何推迟ViewCollection的刷新:

http://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/

但是当View被推迟时我得到一个例外,我尝试在集合中添加一些东西.我不明白为什么不允许这样做.这就是它的第一点.

InvalidoperationException: 在延迟刷新时无法更改或检查CollectionView的内容或当前位置.

有谁知道如何解决这个问题?非常感谢,

Qua*_*kly 16

我认为您误解或歪曲了MSDN对该主题的帮助.他们说你不必修改底层集合来排序或过滤.他们并不是说你不能修改底层集合.OP有一个非常有效的观点.我们有一个已经为用户排序和过滤的大型集合,它显示在列表框中.当用户选择这些记录的范围并想要删除它们时,我们将被强制进入ListCollectionView刷新每个已删除项目的视图的情况.

我认为OP的问题非常有效.性能非常糟糕,因为我们在大量数据上有多个过滤器.DeferRefresh在像ListCollectionView这样的类上有一个真正的目的,但是当你需要它时,它会被莫名其妙地用于插入和删除.

  • DeferRefreshed仅针对类Refresh方法进行排序,分组和过滤.它的唯一目的是推迟添加新排序,过滤器或组时发生的自动刷新.但是,通过暂时忽略对源的更改可能会更好. (2认同)

A.R*_*.R. 2

是的,不要修改有问题的集合。我认为您误解了集合视图的目的。MSDN 是这么说的;

您可以将集合视图视为绑定源集合之上的一层,它允许您基于排序、筛选和组查询来导航和显示集合,而无需操作底层源集合本身

简而言之,不要推迟刷新,直到完成添加和删除以及对集合的其他操作。

  • 正如 DRAirey1 指出的那样,您还没有完全回答这个问题。 (2认同)