首页 > 后端开发 > C++ > 为什么我的 ObservableCollection 不通知项目更改,如何修复它?

为什么我的 ObservableCollection 不通知项目更改,如何修复它?

Mary-Kate Olsen
发布: 2025-01-04 10:15:34
原创
156 人浏览过

Why Doesn't My ObservableCollection Notify on Item Changes, and How Can I Fix It?

为什么通知 ObservableCollection 不能处理项目更改?

在寻找项目更改时通知 ObservableCollection 的解决方案时,您偶然发现了 TrulyObservableCollection,它是旨在解决这个特定问题。但是,在项目中实现此类后,您意识到集合通知没有被触发。

经过调查,很明显问题的根源在于 MyViewModel 类中的 MyItemsSource 属性。虽然您已实现 INotifyPropertyChanged 接口,但尚未包含触发属性更改事件所需的代码。具体来说,您缺少在集合更改时调用 RaisePropertyChangedEvent("MyItemsSource") 的代码。

要解决此问题,您可以将以下行添加到 MyItemsSource 属性的设置器中:

private TrulyObservableCollection<MyType> myItemsSource;
public TrulyObservableCollection<MyType> MyItemsSource
{
    get { return myItemsSource; }
    set 
    { 
        myItemsSource = value; 
        // Code to trig on item change...
        RaisePropertyChangedEvent("MyItemsSource");
    }
}
登录后复制

但是,不建议使用这种方法,因为每当集合更改时,无论是否是由于项目更改,它都会触发属性更改事件或其他一些更改。

另一种更有效的方法是使用 TrulyObservableCollection 的 CollectionChanged 事件为集合中每个项目的 PropertyChanged 事件注册处理程序。这样,您可以有选择地处理单个项目的属性更改,而不是触发整个集合的重置。

以下代码片段说明了这种方法:

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

    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)
{
    // Handle here
}
登录后复制

以上是为什么我的 ObservableCollection 不通知项目更改,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!

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