首页 > 后端开发 > C++ > 如何有效地通知 ObservableCollection 项属性更改?

如何有效地通知 ObservableCollection 项属性更改?

Mary-Kate Olsen
发布: 2025-01-05 19:33:41
原创
237 人浏览过

How to Efficiently Notify an ObservableCollection of Item Property Changes?

如何在项目更改时通知 ObservableCollection

.NET 中的 ObservableCollection 类提供了一种跟踪集合更改的方法,例如添加或移除物品。但是,它不会自动检测集合中项目属性的更改。

为了解决此问题,存在自定义实现,例如问题中提到的 TrulyObservableCollection。此类扩展了 ObservableCollection,并为从集合中添加和删除的项目添加了事件处理程序。它还跟踪单个项目的属性更改。

实现和使用

要使用 TrulyObservableCollection,您首先需要创建一个实例并用项目填充它:

public class MyViewModel
{
    public TrulyObservableCollection<MyType> MyItemsSource { get; set; }

    public MyViewModel()
    {
        MyItemsSource = new TrulyObservableCollection<MyType>();
        MyItemsSource.Add(new MyType() { MyProperty = false });
        MyItemsSource.Add(new MyType() { MyProperty = true });
        MyItemsSource.Add(new MyType() { MyProperty = false });
    }
}
登录后复制

但是,TrulyObservableCollection 的实现会引发整个集合的 Reset 事件每当项目属性发生更改时收集。这可能会对性能产生影响,并且可能不是所需的行为。

替代方法

另一种方法是直接为集合中的每个项目注册属性更改事件处理程序:

public class MyViewModel
{
    public ObservableCollection<MyType> MyItemsSource { get; set; }

    public MyViewModel()
    {
        MyItemsSource = new ObservableCollection<MyType>();
        MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;

        MyItemsSource.Add(new MyType() { MyProperty = false });
        MyItemsSource.Add(new MyType() { MyProperty = true });
        MyItemsSource.Add(new MyType() { MyProperty = false });
    }

    private void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
            foreach (MyType item in e.NewItems)
                item.PropertyChanged += MyType_PropertyChanged;

        if (e.OldItems != null)
            foreach (MyType item in e.OldItems)
                item.PropertyChanged -= MyType_PropertyChanged;
    }

    private void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "MyProperty")
            DoWork(); // Perform desired action
    }
}
登录后复制

通过仅为在集合中添加或删除项目时注册属性更改事件处理程序,此方法针对项目属性更有效地进行更改,同时避免性能开销。

以上是如何有效地通知 ObservableCollection 项属性更改?的详细内容。更多信息请关注PHP中文网其他相关文章!

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