我试图实现一个专门的集合,就像ObservableCollection
在其中封装更多机制一样,为此我还让我的集合继承自Collection
并且我也实现了相同的接口。
我只是不明白如何实际实现整个集合更改逻辑,例如没有被覆盖(它甚至没有标记为虚拟),那么如果使用该方法添加项目Collection<T>.Add
,如何ObservableCollection
触发事件?CollectionChanged
我试图实现一个专门的集合,就像ObservableCollection
在其中封装更多机制一样,为此我还让我的集合继承自Collection
并且我也实现了相同的接口。
我只是不明白如何实际实现整个集合更改逻辑,例如没有被覆盖(它甚至没有标记为虚拟),那么如果使用该方法添加项目Collection<T>.Add
,如何ObservableCollection
触发事件?CollectionChanged
要回答您的具体问题,Collection<T>.Add
请调用InsertItem
虚拟方法(在检查该集合不是只读的之后)。ObservableCollection<T>
确实会覆盖此方法来执行插入并引发相关的更改通知。
它通过调用InsertItem
which 被覆盖并且可以在反编译时看到
protected override void InsertItem(int index, T item)
{
this.CheckReentrancy();
base.InsertItem(index, item);
this.OnPropertyChanged("Count");
this.OnPropertyChanged("Item[]");
this.OnCollectionChanged(NotifyCollectionChangedAction.Add, item, index);
}
请记住,关键不在于重写基本的 Collection 方法,而在于您将实现 ICollection 接口。坦率地说,我建议不要从 Collection 类继承,而是创建一个在构造函数中采用 ICollection 的适配器类,您的方法只会委托给内部集合并引发适当的事件。