Обратите внимание, что я пытаюсь использовать действие 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, что к этому добавляются новые элементы. Элементы
WOW
просто сделал ошеломляющее открытие. Ни один из этих подходов не работал у меня (flush, addrange), потому что ошибка, похоже, срабатывает ТОЛЬКО, если эта коллекция привязана к моему списку!
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)..