如何检测ObservableCollection <T>中包含的项中的属性更改

sof*_*fun 0 c# wpf xaml observablecollection

 private ObservableCollection<Employee> models = new ObservableCollection<Employee>();
Run Code Online (Sandbox Code Playgroud)

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

在我的构造函数中,我

 this.models.CollectionChanged += this.OnCollectionChanged;


void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
Run Code Online (Sandbox Code Playgroud)

我从来没有使用过ObservableCollection,有人可以告诉我如何检测activeDuty字段是否被修改?(我做了一些挖掘并看到很多关于OnCollectionChanged和OnItemPropertyChanged的帖子但是没有理解差异或为什么一个比另一个更受欢迎

15e*_*153 5

ObservableCollection.CollectionChanged将项目添加到集合或从集合中删除时引发.ObservableCollection还实现了INotifyPropertyChanged,只是为了改变自己的个人财产而提出通知- 因此在添加或删除项目时也会PropertyChanged为其Count财产引发事件(你现在没有理由关心它,但我们可能会并把它扔到那里以获得它的价值).

所以:你ObservableCollectionEmployee不会引发任何事件时,其containees的一个有一个属性的变化,无论是否containee器具INotifyPropertyChanged.容器应该实现INotifyPropertyChanged自己,并在其自身的属性值发生变化时引发事件 - 但ObservableCollection包含它的内容不会监听这些事件.我们绝对不需要绝对通知所有人.

确实需要知道何时activeDuty发生变化.简单.

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

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

fred.PropertyChanged += OnItemPropertyChanged;

models.Add(fred);
Run Code Online (Sandbox Code Playgroud)

如果正确Employee实施INotifyPropertyChanged,Fred的活动水平的任何可检测的增加将立即被感知到OnItemPropertyChanged.该object sender参数将是弗雷德和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.
}
Run Code Online (Sandbox Code Playgroud)

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