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

时间:2016-04-26 19:23:26

标签: c# wpf xaml observablecollection

 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的帖子但是没有理解差异或为什么一个是优先于另一个

1 个答案:

答案 0 :(得分:5)

将项目添加到集合或从集合中删除时,会引发

ObservableCollection.CollectionChangedObservableCollection还会实现INotifyPropertyChanged,仅针对其自己的个人属性的更改提出通知 - 因此也会为其{{1}引发PropertyChanged事件添加或删除项目时的属性(您现在没有理由关心它,但我们也可以将它丢弃在那里以获得它的价值)。

所以:Count ObservableCollection Employee当其中一个集装箱发生财产变更时,不会发生任何事件,无论集装箱是否实施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);

如果Employee正确实施INotifyPropertyChanged,则OnItemPropertyChanged会立即感知到Fred的活动级别的任何可检测的增加。 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上的非常方便的地方。