如何检测 ObservableCollection<T> 中包含的项目的 属性 变化

How to detect property changes in items contained in ObservableCollection<T>

 private ObservableCollection<Employee> models = new ObservableCollection<Employee>();

我的模型有 2 个字段(Name 和一个名为 activeDuty 的布尔字段)

在我的构造函数中,我

 this.models.CollectionChanged += this.OnCollectionChanged;


void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)

我从未使用过 ObservableCollection,有人能告诉我如何检测 activeDuty 字段是否被修改吗?(我做了一些挖掘,看到了很多关于 OnCollectionChanged 和 OnItemPropertyChanged 的​​帖子,但不明白其中的区别或为什么是优于另一个

ObservableCollection.CollectionChanged 在将项目添加到集合或从集合中删除时引发。 ObservableCollection 还实现了 INotifyPropertyChanged,仅针对其 自己的个人属性 的更改发出通知——因此也会为其发出 PropertyChanged 事件Count 属性 当一个项目被添加或删除时(你现在没有理由关心它,但我们也可以把它扔在那里,因为它的价值)。

因此:当其中一个容器发生 属性 更改时,您的 EmployeeObservableCollection 不会引发任何事件,无论容器是否实现 [=14] =].容器 应该 实现 INotifyPropertyChanged 本身,并在它自己的 属性 值改变时引发事件——但是包含它的 ObservableCollection 不会监听那些事件。我们不需要绝对通知所有人绝对所有事情。

但是 确实需要知道 activeDuty 何时更改。简单。

当您创建新的 Employee 实例时,您可以使用 OnItemPropertyChanged 处理程序处理它们的 PropertyChanged 事件:

//  Fred's not what you'd call active.
var fred = new Employee { Name = "Fred", activeDuty = false };

fred.PropertyChanged += OnItemPropertyChanged;

models.Add(fred);

如果 Employee 正确实施 INotifyPropertyChanged,Fred 的 activity 水平的任何可检测到的增加都会立即在 OnItemPropertyChanged 中被察觉。 object sender 参数将是 Fred,e.PropertyName 将是字符串 "activeDuty"

public class Employee : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool _activeDuty = false;
    public bool activeDuty {
        get { return _activeDuty; }
        set {
            _activeDuty = value;
            PropertyChanged?.Invoke(this, 
                new PropertyChangedEventArgs(nameof(activeDuty)));
        }
    }

    //  Name implemented similarly -- either that, or give it a protected 
    //  setter and initialize it in the constructor, to prevent accidents.
}

我认为您不需要处理 models.CollectionChanged 除非随机添加其他视图模型。如果可以的话,那么这是一个非常方便的地方,可以将 PropertyChanged 处理程序放在新的 Employee 上。