обратите внимание, что я пытаюсь использовать действие NotifyCollectionChangedAction.Add вместо .Reset. последний работает, но он не очень эффективен с большими коллекциями.ObservableCollection: вызов OnCollectionChanged с несколькими новыми элементами
так я подклассы 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));
}
}
бросает Коллекции Добавить событие относится к пункту, который не принадлежит к коллекции
это, кажется, бу g в BCL?
я могу пошагово увидеть до вызова OnCollectionChanged, что новые элементы добавляются в this.Items
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).
Почему RemoveRange, AddRange fires Сброс? Может быть, кто-то не мог понять разницу между значениями remove, add и reset? –