c# - 检查对象是否附加了 PropertyChanged 事件

标签 c# wpf

当我的窗口加载时,我有一个填充的 ObservableCollection,并且 PropertyChanged 事件被添加到每个项目。但是,在初始加载项目之后可以将其添加到 ObservableCollection。我希望能够监听 ObservableCollection 上的集合更改,检查是否添加了项目,然后在添加时附加事件监听器。

为此,我希望能够检查是否为每个单独的项目定义了 PropertyChanged 属性,如果没有,则附加一个 PropertyChanged 事件。

这是我的代码:

items.CollectionChanged += (object sender, NotifyCollectionChangedEventArgs e) =>
{
    foreach (var item in items.Where(o => o.PropertyChanged == null)) //error here
    {
        item.PropertyChanged += Item_PropertyChanged;
    }
};

但是,我收到一个编译错误:

The event 'ModelBase.PropertyChanged' can only appear on the left hand side of += or -=

关于如何检查一个对象是否定义了它的 PropertyChanged 属性事件有什么想法吗?

最佳答案

您可以迭代 NotifyCollectionChangedEventArgs 的 OldItemsNewItems 属性。

对于 System.Collections.ObjectModel.ObservableCollection,这适用于 e.Action 的所有值,NotifyCollectionChangedAction.Reset 除外。

items.CollectionChanged += (s, e) =>
{
    if (e.OldItems != null)
    {
        foreach (var item in e.OldItems.OfType<INotifyPropertyChanged>())
        {
            item.PropertyChanged -= Item_PropertyChanged;
        }
    }
    if (e.NewItems != null)
    {
        foreach (var item in e.NewItems.OfType<INotifyPropertyChanged>())
        {
            item.PropertyChanged += Item_PropertyChanged;
        }
    }
};

关于c# - 检查对象是否附加了 PropertyChanged 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48953416/

相关文章:

c# - CefSharp chromium 浏览器字体问题

wpf - XAML vs WPF vs Store App vs Phone App vs UWA

c# - 如何计算WPF中从一个区域/矩形到另一个区域/矩形的变换矩阵?

c# - WPF richtextbox 上的多语言拼写检查

c# - 用于测试多个项目并可能放弃的并行模式

c# - 为什么 C# 性能比 VB 慢

c# - 图形 - 在图片框中键入文本

c# - 什么是 nHibernate CollectionProxy

wpf - 如何对 XAML 中定义的矩形使用 IntersectsWith 方法

c# - EnumerateFiles in drive 使用 LINQ 跳过回收站