ObservableCollection.Add 是如何工作的?

发布于 2024-10-18 06:57:01 字数 301 浏览 5 评论 0原文

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

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

I was trying to implement a specialized collection that works like ObservableCollection to encapsulate some more mechanisms in it, to do that i also let my collection inherit from Collection and i also implement the same interfaces.

I just do not get though how one actually implements the whole collection-changed-logic, for example Collection<T>.Add is not being overridden (it is not even marked as virtual), so how does the ObservableCollection fire the CollectionChanged event if items were added using that method?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

佞臣 2024-10-25 06:57:01

为了回答您的具体问题,Collection.Add 调用 InsertItem 虚拟方法(在检查集合不是只读之后)。 ObservableCollection 确实重写了此方法来执行插入操作并引发相关更改通知。

To answer your specific question, Collection<T>.Add calls the InsertItem virtual method (after checking that the collection is not read-only). ObservableCollection<T> indeed overrides this method to do the insert and raise the relevant change notifications.

彡翼 2024-10-25 06:57:01

它通过调用 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);
}

It does so by calling InsertItem which is overridden and can be seen upon decompilation

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);
}
被翻牌 2024-10-25 06:57:01

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

Remember, the key is not in overriding the base Collection methods, it's in the fact that you will be implementing the ICollection interface. And frankly, rather than inheriting from a Collection class, I would suggest instead creating an adapter class that takes a ICollection in the constructor and your methods will just delegate to the inner collection and raise the appropriate events.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文