2016-09-07 89 views
2

我注意到如果我使用RemoveRange从ObservableCollection中删除所有项目,它会更新用户界面,但是如果至少剩下单个项目,则不会。通过查看ObservableCollection源代码here,我看不到他们正在做什么来刷新内部Items集合。我基本上是分类ObservableCollection并实现我自己的OnCollectionChanged行为,以防止UI性能问题,并面临这个问题。这个方向有什么想法?任何有关如何刷新observablecollection的指针?刷新ObservableCollection

感谢, 周杰伦

回答

0

总之观察集合触发NotifyProperty改变事件的底层集合所做的更改。所以,如果你看到的公共方法可以在观察集合的源代码,你提到你会看到执行InsertItem,的removeItem,ClearItems等..他们叫OnPropertyChanged(IndexerName);

至于RemoveRange方法时不通过的ObservableCollection而是由实施底层列表,它不会调用OnPropertyChanged(IndexerName);,因此您不会观察UI中的更改。我建议你不要使用删除范围,而是循环遍历项目并逐个删除它们。

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

+0

当我逐一删除它们或逐个添加它们时,性能会受到影响。它会为绑定的DataGrid控件导致3000+的UI通知,并冻结UI。 –

+0

查看上面提供的链接,它的实现只针对一个范围通知一次。 – CarbineCoder

+0

谢谢。我已经知道这个链接。我尝试了它,并遵循相同的方法,但仍然没有看到UI的更改。我也显式调用了Items []和Count的属性。 –

1

你使用NotifyCollectionChangedEventArgsOldItemsNewItems当你的UI在OnCollectionChanged激活?

ClearItems方法或添加/ @CarbineCoder答案的链接删除Range方法不作OldItemsNewItemsNotifyCollectionChangedEventArgs。 它只有NotifyCollectionChangedAction.Reset

我想如果你的UI代码修改根据OldItemsNewItems它不工作呼吁ClearItems或自定义实现的范围方法,如链接。

+0

让我试试看! –

+0

祝福有错误:构造函数只支持'Replace'操作。 您的观察与OldItems和NewItems似乎是正确的,但没有办法为他们提供重置操作。 –