C # ObservableCollection OnCollectionChanged не запускается при изменении элемента - PullRequest
4 голосов
/ 18 августа 2011

Из MSDN о OnCollectionChanged: «Происходит при добавлении, удалении, изменении, перемещении или обновлении всего списка».

Я изменяю свойство, прикрепленное к объекту, который находится в моей коллекции, но OnCollectionChanged не запускается. Я реализую iNotifyPropertyChanged в классе obj.

public class ObservableBatchCollection : ObservableCollection<BatchData>
    {
        protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            if(e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
            {
                foreach (BatchData item in e.NewItems)
                {

                }
            }
            base.OnCollectionChanged(e);
        }

        public ObservableBatchCollection(IEnumerable<BatchData> items)
            : base(items)
        {

        }
}

Для меня это означает, что при изменении элемента в коллекции, такого как свойство объекта, должно возникать это событие. Это не так, однако. Я хочу знать, когда изменяется элемент в моей пользовательской коллекции, чтобы при необходимости я мог выполнить для него расчет.

Есть мысли?

1 Ответ

7 голосов
/ 18 августа 2011

ObservableCollection<T> вызывает события, только когда сама коллекция меняет . Элемент, содержащийся в коллекции с измененным внутренним состоянием, не изменил структуру коллекции, и ObservableCollection<T> не сообщит об этом.

Один из вариантов - создать подкласс ObservableCollection<T> и подписаться на событие OnPropertyChanged каждого элемента при его добавлении. В этом обработчике вы можете вызвать либо пользовательское событие, либо вернуться к собственному событию PropertyChanged коллекции. Обратите внимание, что если вы идете по этому пути, вы должны добавить общее ограничение, чтобы T : INotifyPropertyChanged.

...