Это старый вопрос, но в интересах любого, кто может столкнуться с этим путем поиска, как я:
NotifyCollectionChangedAction.Reset
означает «Содержание коллекции резко изменилось». Один из случаев, когда возникает событие Reset, - это когда вы вызываете Clear()
для базовой наблюдаемой коллекции.
С событием Reset вы не получите наборы NewItems
и OldItems
в параметре NotifyCollectionChangedEventArgs
.
Это означает, что вам лучше использовать «отправителя» события, чтобы получить ссылку на измененную коллекцию и использовать ее напрямую, т.е. предположить, что это новый список.
Примером этого может быть что-то вроде:
((INotifyCollectionChanged)stringCollection).CollectionChanged += new NotifyCollectionChangedEventHandler(StringCollection_CollectionChanged);
...
void StringCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (string s in e.NewItems)
{
InternalAdd(s);
}
break;
case NotifyCollectionChangedAction.Remove:
foreach (string s in e.OldItems)
{
InternalRemove(s);
}
break;
case NotifyCollectionChangedAction.Reset:
ReadOnlyObservableCollection<string> col = sender as ReadOnlyObservableCollection<string>;
InternalClearAll();
if (col != null)
{
foreach (string s in col)
{
InternalAdd(s);
}
}
break;
}
}
Множество обсуждений об этом событии сброса здесь: При очистке ObservableCollection в e.OldItems нет элементов .