C#中的ObservableCollection在项更改时未触发OnCollectionChanged事件

4

根据MSDN中关于OnCollectionChanged的说明:“在项被添加、移除、更改、移动或整个列表被刷新时发生。”

我修改了一个存储在我的集合中对象上的属性,但OnCollectionChanged事件并未触发。我在该对象类中实现了iNotifyPropertyChanged接口。

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
ObservableCollection<T>只有在集合本身发生更改时才会触发事件。如果集合中包含的项目其内部状态发生变化,这并不会改变集合的结构,因此ObservableCollection<T>不会报告它。
一种选择是对ObservableCollection<T>进行子类化,并在添加每个项目时订阅其OnPropertyChanged事件。在该处理程序中,您可以引发自定义事件,或者回退到集合自己的PropertyChanged事件。请注意,如果您选择这条路,应添加一个泛型约束,以便T : INotifyPropertyChanged

是的,他们所说的“更改”是指执行collection[i] = newItem;,而不是更改旧项目。 - CodeNaked
2
哦,这份文档对我来说有点不清楚。“...当一个项目被更改时”,对我来说意味着“当一个项目被更改时”。哈哈,谢谢大家。 - Yatrix
你是正确的——它不清楚,因为措辞有误。 “当添加、删除、更改、移动项或整个列表刷新时发生”——逗号的放置表明您应该将其解读为:“当添加项时,(当删除项时),(当更改项时),(当移动项时)或整个列表刷新时”。 - user164226

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接