首页 > 后端开发 > C++ > 如何有效地通知 ObservableCollection 项目级别的更改?

如何有效地通知 ObservableCollection 项目级别的更改?

Linda Hamilton
发布: 2025-01-05 04:04:39
原创
267 人浏览过

How to Efficiently Notify an ObservableCollection of Item-Level Changes?

通知 ObservableCollection 项目更改

如果 ObservableCollection 中的项目发生更改,则有必要将这些更改通知集合确保正确的 UI 更新。 ObservableCollection 的默认行为在观察项目级变化方面存在不足,促使人们探索替代解决方案。

TrulyObservableCollection

一种方法涉及利用 TrulyObservableCollection 类,该类扩展ObservableCollection 并包含其项目上的 PropertyChanged 事件的订阅机制。这可以按如下方式实现:

public class TrulyObservableCollection<T> : ObservableCollection<T>
where T : INotifyPropertyChanged
{
    public TrulyObservableCollection()
        : base()
    {
        CollectionChanged += TrulyObservableCollection_CollectionChanged;
    }

    void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
    }

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
        OnCollectionChanged(a);
    }
}
登录后复制

实现问题

但是,使用 TrulyObservableCollection 可能不会产生预期的结果。要充分利用其功能,MyViewModel 类必须为 MyItemsSource 的 CollectionChanged 事件注册一个处理程序:

public MyViewModel()
{
    MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
}
登录后复制

替代方法:常规 ObservableCollection

另一种方法是使用标准 ObservableCollection 并手动订阅 CollectionChanged 中的项目级 PropertyChanged 事件handler:

public MyViewModel()
{
    MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
    
    // Add items to the collection
    MyItemsSource.Add(new MyType() { MyProperty = false });
    MyItemsSource.Add(new MyType() { MyProperty = true});
    MyItemsSource.Add(new MyType() { MyProperty = false });
}

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;
}

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

通过这种方法,当项目的 MyProperty 更改时会专门触发 UI 更新,从而无需对整个集合进行粗略更新。

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

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