首页 > 后端开发 > C++ > 如何让 ObservableCollection 在项属性更改时发出通知?

如何让 ObservableCollection 在项属性更改时发出通知?

Barbara Streisand
发布: 2025-01-04 12:12:35
原创
647 人浏览过

How to Make ObservableCollection Notify When Item Properties Change?

当项目更改时通知 ObservableCollection

ObservableCollection 是一个方便的集合类型,它实现了 INotifyCollectionChanged 接口,它允许您监听集合中的更改。但是,ObservableCollection 不会通知对集合中项目的属性所做的更改。

克服限制

要解决此限制,您可以实现自定义 ObservableCollection称为TrulyObservableCollection,它继承自ObservableCollection并重写CollectionChanged事件处理程序来订阅和取消订阅添加到集合中和从集合中删除的项目的 PropertyChanged 事件。

TrulyObservableCollection

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,只需将 ObservableCollection 替换为代码中的 TrulyObservableCollection。您需要将处理程序附加到集合的 CollectionChanged 事件来处理更改。

MyItemsSource = new TrulyObservableCollection<MyType>();
MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
登录后复制

在 CollectionChanged 事件处理程序中,您可以订阅或取消订阅从集合中添加和删除的项目的 PropertyChanged 事件。

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

    if (e.OldItems != null)
        foreach (MyType item in e.OldItems)
            item.PropertyChanged -= new PropertyChangedEventHandler(MyType_PropertyChanged);
}
登录后复制

替代方案方法

虽然 TrulyObservableCollection 允许您强制收集更改通知,但它可能不是最佳方法。更常见的模式是在 ObservableCollection 的 CollectionChanged 处理程序中处理单个项目的 PropertyChanged 事件。这可确保只有集合中的特定属性更改才会导致 UI 更新,从而优化性能并提供更精细的控制。

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

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