刷新ObservableCollection

时间:2016-09-07 09:37:27

标签: c# observablecollection

我注意到一种情况,如果我使用RemoveRange从ObservableCollection中删除所有项目,它会更新UI,但如果至少有一个项目,则不会。通过查看ObservableCollection源代码here,我无法看到他们为刷新内部Items集合所做的具体操作。我基本上是对ObservableCollection进行子类化并实现我自己的OnCollectionChanged行为,以防止UI性能问题并面临这个问题。这个方向有什么想法吗?关于如何刷新observablecollection的任何指针?

谢谢, 杰

2 个答案:

答案 0 :(得分:1)

当您的用户界面在OldItems中激活时,您是否在NewItems中使用NotifyCollectionChangedEventArgsOnCollectionChanged

@CarbineCoder答案链接中的

ClearItems方法或添加/删除范围方法不会将OldItemsNewItems设为NotifyCollectionChangedEventArgs。 它只有NotifyCollectionChangedAction.Reset

我认为,如果根据OldItemsNewItems修改了您的用户界面代码,则无法调用ClearItems或自定义实现的范围方法,例如链接。

答案 1 :(得分:0)

简而言之,Observable collection触发器NotifyProperty更改了对底层集合所做更改的事件。因此,如果您看到您提到的Observable集合源代码中提供的公共方法,您将看到InsertItem,RemoveItem,ClearItems等的实现。他们调用OnPropertyChanged(IndexerName);

RemoveRange方法而言,它不是由ObservableCollection实现的,而是由不调用OnPropertyChanged(IndexerName);的基础List实现的,因此您不会观察UI中的更改。我建议你不要使用删除范围,而是遍历项目并逐个删除它们。

您可以看到removerange的实现 - https://stackoverflow.com/a/670579/442444