Подтвердить что ты не робот

То, что notifycollectionchangedaction reset значение

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

  • Частный элемент Т.
  • Выбран частный bool.

Когда свойство IsSelected изменяется... Моя измененная собственность коллекции не срабатывает.

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

4b9b3361

Ответ 1

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

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;
    }
}

Здесь много обсуждений этого события Reset: При очистке наблюдаемого набора в элементе e.OldItems нет элементов.

Ответ 2

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

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

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

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

Ответ 3

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