7

我试图实现一个专门的集合,就像ObservableCollection在其中封装更多机制一样,为此我还让我的集合继承自Collection并且我也实现了相同的接口。

我只是不明白如何实际实现整个集合更改逻辑,例如没有被覆盖(它甚至没有标记为虚拟),那么如果使用该方法添加项目Collection<T>.Add,如何ObservableCollection触发事件?CollectionChanged

4

3 回答 3

10

要回答您的具体问题,Collection<T>.Add请调用InsertItem虚拟方法(在检查该集合不是只读的之后)。ObservableCollection<T>确实会覆盖此方法来执行插入引发相关的更改通知。

于 2011-02-16T22:11:25.633 回答
8

它通过调用InsertItemwhich 被覆盖并且可以在反编译时看到

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);
}
于 2011-02-16T22:14:48.543 回答
0

请记住,关键不在于重写基本的 Collection 方法,而在于您将实现 ICollection 接口。坦率地说,我建议不要从 Collection 类继承,而是创建一个在构造函数中采用 ICollection 的适配器类,您的方法只会委托给内部集合并引发适当的事件。

于 2011-02-16T22:12:24.883 回答