Что такое значение сброса notifycollectionactionaction
У меня есть наблюдаемая коллекция...SelectableDataContext<T>
..И в общем классе SelectableDataContext<T>
это... с двумя закрытыми переменными-членами
- Частный T элемент.
- Частный бул выбран.
Когда свойство IsSelected изменяется... измененное свойство моей коллекции не запускается.
Я думаю, что это должно выстрелить... потому что это Reset
в INotifyCollectionChangedAction
,
3 ответа
Это старый вопрос, но в интересах любого, кто может столкнуться с этим путем поиска, как я сделал:
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.
Есть разница между INotifyCollectionChanged
а также INotifyPropertyChanged
,
Когда значение свойства в объекте изменяется, оно должно уведомить других, используя INotifyPropertyChanged
реализация интерфейса.
С другой стороны, когда number of items
или же items themselves
изменение в коллекции, оно должно дать знать другим, используя INotifyCollectionChanged
реализация.
Теперь, в вашем случае, значение свойства объекта в вашей коллекции изменяется. Это должно поднять PropertyChanged
событие, а не CollectionChanged
событие.
Измененная коллекция будет запущена тогда и только тогда, когда вы измените коллекцию, добавив новый элемент или удалив существующий элемент из коллекции.