首页 >后端开发 >C++ >是否存在一个集合可以监控其自身及其元素的变化?

是否存在一个集合可以监控其自身及其元素的变化?

DDD
DDD原创
2025-01-07 16:27:41927浏览

Does a Collection Exist That Monitors Changes in Both Itself and Its Elements?

监控元素变化的集合

本文探讨了监控集合本身以及集合元素变化的概念。通常,ObservableCollection 会通知集合本身的变化,但不会通知其元素的变化。

是否存在能够监控元素变化的现有集合?

是的,您可以创建一个自定义实现来扩展 ObservableCollection 以满足此要求。

具有元素监控功能的自定义 ObservableCollection:

这是一个修改后的 ObservableCollection 版本:

<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
    // 订阅添加到项目中的 PropertyChanged 事件
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        Subscribe(e.NewItems);
        base.OnCollectionChanged(e);
    }

    // 取消订阅从移除的项目中移除的 PropertyChanged 事件,并在清除集合时清除所有项目
    protected override void ClearItems()
    {
        foreach (T element in this)
            element.PropertyChanged -= ContainedElementChanged;
        base.ClearItems();
    }

    // 订阅元素中的 PropertyChanged 事件
    private void Subscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged += ContainedElementChanged;
        }
    }

    // 取消订阅元素中的 PropertyChanged 事件
    private void Unsubscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged -= ContainedElementChanged;
        }
    }

    // 当包含的元素属性更改时发出通知
    private void ContainedElementChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged(e);
    }
}</code>

使用此自定义集合:

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

使用 PropertyChanged 事件时的注意事项:

请注意,当在自定义集合上使用 PropertyChanged 事件时,发送者将是集合本身,而不是发生更改的元素。如有必要,您可以为更明确的通知定义单独的 ContainerElementChanged 事件。

以上是是否存在一个集合可以监控其自身及其元素的变化?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn