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的帖子但是没有理解差异或为什么一个是优先于另一个
答案 0 :(得分:5)
ObservableCollection.CollectionChanged
。 ObservableCollection
还会实现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
上的非常方便的地方。