首页 > 后端开发 > C++ > 是否存在可跟踪集合和元素属性更改的 ObservableCollection?

是否存在可跟踪集合和元素属性更改的 ObservableCollection?

Susan Sarandon
发布: 2025-01-07 16:36:40
原创
861 人浏览过

Does an ObservableCollection Exist That Tracks Both Collection and Element Property Changes?

监控集合和元素属性变化的ObservableCollection

问题:

是否存在一种集合能够同时监控集合本身的变化和其元素的属性变化?

解决方案:

如果没有现成的集合满足此需求,您可以创建一个扩展ObservableCollection的实现,来监控其元素的PropertyChanged事件。

实现:

以下是一个ObservableCollectionEx的示例实现,它实现了这个功能:

public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        Unsubscribe(e.OldItems);
        Subscribe(e.NewItems);
        base.OnCollectionChanged(e);
    }

    protected override void ClearItems()
    {
        foreach (T element in this)
            element.PropertyChanged -= ContainedElementChanged;

        base.ClearItems();
    }

    private void Subscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged += ContainedElementChanged;
        }
    }

    private void Unsubscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged -= ContainedElementChanged;
        }
    }

    private void ContainedElementChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(e.PropertyName)); //Corrected this line.
    }
}
登录后复制

用法:

像使用普通的ObservableCollection一样使用ObservableCollectionEx,但将其转换为INotifyPropertyChanged以订阅其元素的属性更改事件:

ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();
登录后复制

注意: ContainedElementChanged 方法中,OnPropertyChanged 的参数需要是新的 PropertyChangedEventArgs 实例,而不是直接使用 e。 这已经在上文的代码中进行了更正。 这确保了正确的属性名被传递到事件处理程序。

以上是是否存在可跟踪集合和元素属性更改的 ObservableCollection?的详细内容。更多信息请关注PHP中文网其他相关文章!

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