【发布时间】:2010-07-21 15:15:23
【问题描述】:
请注意,我正在尝试使用 NotifyCollectionChangedAction.Add 操作而不是 .Reset。后者确实有效,但对于大型集合来说效率不高。
所以我继承了 ObservableCollection:
public class SuspendableObservableCollection<T> : ObservableCollection<T>
由于某种原因,这段代码:
private List<T> _cachedItems;
...
public void FlushCache() {
if (_cachedItems.Count > 0) {
foreach (var item in _cachedItems)
Items.Add(item);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add, (IList<T>)_cachedItems));
}
}
正在投掷 集合添加事件指的是不属于集合的项目
这似乎是 BCL 中的错误?
我可以在调用 OnCollectionChanged 之前逐步查看新项目已添加到 this.Items
哇
刚刚有了一个惊人的发现。这些方法都不适合我(flush、addrange),因为只有当这个集合绑定到我的 Listview 时才会触发错误!
TestObservableCollection<Trade> testCollection = new TestObservableCollection<Trade>();
List<Trade> testTrades = new List<Trade>();
for (int i = 0; i < 200000; i++)
testTrades.Add(t);
testCollection.AddRange(testTrades); // no problems here..
_trades.AddRange(testTrades); // this one is bound to ListView .. BOOOM!!!
总之,ObservableCollection 确实支持添加增量列表,但 ListView 不支持。 Andyp 想出了一个解决方法,让它与下面的 CollectionView 一起工作,但是由于调用了 .Refresh(),这与调用 OnCollectionChanged( .Reset ) 没有什么不同..
【问题讨论】:
-
为什么 RemoveRange、AddRange 会触发重置?也许有人不明白删除、添加和重置含义之间的区别?
标签: c# generics c#-4.0 subclass observablecollection