Что такое значение сброса notifycollectionactionaction - PullRequest
14 голосов
/ 21 декабря 2010

У меня есть наблюдаемая коллекция ... SelectableDataContext<T> .. А в общем классе SelectableDataContext<T> есть ... с двумя закрытыми переменными-членами

  1. Закрытый элемент T.
  2. Private bool isSelected.

Когда свойство IsSelected изменяется ... Измененное свойство моей коллекции не запускается.

Я думаю, что оно должно сработать ... потому что оно Reset в INotifyCollectionChangedAction.

Ответы [ 3 ]

34 голосов
/ 17 ноября 2011

Это старый вопрос, но в интересах любого, кто может столкнуться с этим путем поиска, как я:

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 нет элементов .

2 голосов
/ 21 декабря 2010

Существует разница между INotifyCollectionChanged и INotifyPropertyChanged.

Когда значение свойства в объекте изменяется, оно должно уведомлять других, используя INotifyPropertyChanged реализацию интерфейса.

С другой стороны, когда number of items или items themselves изменяется в коллекции, он должен сообщить об этом другим, используя реализацию INotifyCollectionChanged.

Теперь, в вашем случае, значение свойства объекта в вашемколлекция изменений.Это должно вызвать событие PropertyChanged, а не событие CollectionChanged.

0 голосов
/ 21 декабря 2010

Коллекция будет изменена, если и только если вы измените коллекцию, добавив новый элемент или удалив существующий элемент из коллекции.

...