ObservableCollection<T>.Add是如何工作的?

7

我试图实现一个类似于ObservableCollection的专用集合来封装其中的一些机制,为此我让我的集合继承自Collection并实现了相同的接口。

然而,我不知道如何实现整个集合更改逻辑,例如Collection<T>.Add没有被重写(甚至没有标记为虚拟方法),那么如果使用该方法添加项,ObservableCollection如何触发CollectionChanged事件呢?

3个回答

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

1
@H.B.,你听说过Reflector吗? - Darin Dimitrov
@Darin:所有版本都有时间限制,所以无论如何我们的免费使用期很快就要结束了。 - Ani
@Ani,是的,那真的很糟糕。我们得破解它。绝不会为此支付35美元。 - Darin Dimitrov
1
@H.B.:不要浪费时间在Reflector上了,ILSpy才是未来。 - Rick Sladkey
10
“最好的.NET工具”“必须破解它。不会花35美元买它。”...你对价值的概念完全令我困惑。 Translated: “Best .NET tool” “I have to crack it. I'm not going to pay 35 dollars for it.” ...Your concept of value is completely baffling to me. - Dan J
显示剩余5条评论

8
它通过调用“InsertItem”来实现,该函数被重写并且可以在反编译时看到。
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);
}

谢谢,Ani更快一些,所以我把这个交给了他/她。 - H.B.

0
记住,关键并不在于重写基本的集合方法,而在于你要实现ICollection接口。坦白说,我建议你不要继承Collection类,而是创建一个适配器类,在构造函数中使用ICollection参数,然后你的方法只需委托给内部集合,并引发相应的事件。

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