To stara sprawa, ale z korzyścią dla każdego, kto może natknąć się to poprzez poszukiwanie jak ja:
NotifyCollectionChangedAction.Reset
oznacza „Zawartość kolekcji zmieniła się dramatycznie”. Jeden przypadek, w którym podniesiono zdarzenie Reset, ma miejsce, gdy wywołuje się Clear()
w podstawowej obserwowalnej kolekcji.
W przypadku zdarzenia Resetowanie nie są pobierane kolekcje NewItems
i OldItems
w parametrze NotifyCollectionChangedEventArgs
.
Oznacza to, że lepiej jest użyć "nadawcy" zdarzenia, aby uzyskać odniesienie do zmodyfikowanego zbioru i użyć go bezpośrednio, tj. Założyć, że jest to nowa lista.
Przykładem tego może być coś takiego:
((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;
}
}
Wiele dyskusji na ten reset imprezy tutaj: When Clearing an ObservableCollection, There are No Items in e.OldItems.
Ale czym jest RESET? – Relativity