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