首页 > 后端开发 > C++ > 如何创建一个 ObservableCollection 来监视其元素属性的变化?

如何创建一个 ObservableCollection 来监视其元素属性的变化?

Linda Hamilton
发布: 2025-01-07 16:37:46
原创
696 人浏览过

How Can I Create an ObservableCollection That Monitors Changes in its Element Properties?

监控元素变化的 ObservableCollection

问题陈述

设想一个 ObservableCollection,其中元素实现 INotifyPropertyChanged,并且集合本身会监控这些元素的任何更改。尽管存在 ObservableCollection,但尚不清楚是否有预先存在的集合满足此确切要求。

解决方案

ObservableCollectionEx 类

建议的解决方案引入了 ObservableCollectionEx,它是 ObservableCollection 的扩展。在此实现中:

  • OnCollectionChanged:更新已添加或删除项目的事件订阅。
  • ClearItems:在清除之前取消订阅元素的属性更改。
  • Subscribe:订阅新添加项目的属性更改。
  • Unsubscribe:取消订阅已删除项目的属性更改。
  • ContainedElementChanged:将元素的属性更改传播到集合。

用法

ObservableCollectionEx 的使用方法如下:

<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
登录后复制

注意事项

虽然此实现会在元素属性更改时触发集合的 PropertyChanged 事件,但这可能会造成混淆。因此,可以引入一个专门用于此类更改的附加事件。

此外,BCL 中的 ObservableCollection 实现仅显式公开 INotifyPropertyChanged 接口。订阅事件需要进行强制转换,如下所示:

<code class="language-csharp">((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
登录后复制

需要注意的是,取消订阅 PropertyChanged 需要将事件处理程序设置为 null:

<code class="language-csharp">collection.PropertyChanged -= (s, e) => { Trace.WriteLine("Changed " + e.PropertyName); };</code>
登录后复制

以上是如何创建一个 ObservableCollection 来监视其元素属性的变化?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板