C# 如何检测ObservableCollection中包含的项目的属性更改<;T>;
我从未使用过ObservableCollection,有人能告诉我如何检测activeDuty字段是否被修改?(我做了一些挖掘,看到了许多关于OnCollectionChanged和OnItemProperty Changed的帖子,但我不明白它们之间的区别,也不明白为什么一个比另一个更受欢迎。C# 如何检测ObservableCollection中包含的项目的属性更改<;T>;,c#,wpf,xaml,observablecollection,C#,Wpf,Xaml,Observablecollection,我从未使用过ObservableCollection,有人能告诉我如何检测activeDuty字段是否被修改?(我做了一些挖掘,看到了许多关于OnCollectionChanged和OnItemProperty Changed的帖子,但我不明白它们之间的区别,也不明白为什么一个比另一个更受欢迎。ObservableCollection。CollectionChanged是在向集合中添加或从集合中删除项目时引发的。ObservableCollection也在otifyPropertyChanged
ObservableCollection。CollectionChanged
是在向集合中添加或从集合中删除项目时引发的。ObservableCollection
也在otifyPropertyChanged,只为其个人属性的更改发出通知,因此在添加或删除项目时,也会为其Count
属性发出PropertyChanged
事件(您现在没有理由关心这一点,但我们不妨将其丢弃)
因此:Employee
的ObservableCollection
不会在其一个容器对象发生属性更改时引发任何事件,无论容器对象是否实现了INotifyPropertyChanged
。容器对象应该实现INotifyPropertyChanged
自身,并在其自身属性发生更改时引发事件值会发生变化——但包含它的ObservableCollection
不会侦听这些事件。我们不需要绝对地通知所有人所有事情
但是你需要知道什么时候现役
改变。简单
创建新的Employee
实例时,可以使用OnItemPropertyChanged
处理程序处理其PropertyChanged
事件:
this.models.CollectionChanged += this.OnCollectionChanged;
void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
如果Employee
正确实施了INotifyPropertyChanged
,Fred活动水平的任何可检测到的增加都将立即在onimpropertychanged
中被感知。object sender
参数将是Fred,而e.PropertyName
将是字符串“activeDuty”
我认为您不需要处理
模型。CollectionChanged
除非可以向其中添加随机的其他视图模型。如果可以,那么这是一个非常方便的地方,可以将属性更改的
处理程序放在新的员工的上。ObservableCollection。CollectionChanged
在添加项目时引发添加到集合或从集合中删除。ObservableCollection
还实现了INotifyPropertyChanged
,仅用于为其自身个人属性的更改发出通知,因此在添加或删除项目时,还将为其Count
属性引发PropertyChanged
事件(你现在没有任何理由关心这个问题,但我们不妨把它扔出去,不管它值多少钱)
因此:Employee
的ObservableCollection
不会在其一个容器对象发生属性更改时引发任何事件,无论容器对象是否实现了INotifyPropertyChanged
。容器对象应该实现INotifyPropertyChanged
自身,并在其自身属性发生更改时引发事件值会发生变化——但包含它的ObservableCollection
不会侦听这些事件。我们不需要绝对地通知所有人所有事情
但是你需要知道什么时候现役
改变。简单
创建新的Employee
实例时,可以使用OnItemPropertyChanged
处理程序处理其PropertyChanged
事件:
this.models.CollectionChanged += this.OnCollectionChanged;
void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
如果Employee
正确实施了INotifyPropertyChanged
,Fred活动水平的任何可检测到的增加都将立即在onimpropertychanged
中被感知。object sender
参数将是Fred,而e.PropertyName
将是字符串“activeDuty”
我认为您不需要处理模型。CollectionChanged
除非随机添加其他viewmodels。如果可以,那么这是一个非常方便的地方,可以将PropertyChanged
处理程序放置在新的员工上。您可以使用CollectionChanged
类似的事件“在添加、删除、更改、移动项目或刷新整个列表时发生。此问题,尤其是已接受的答案,都比已标记重复项的问题更简单,更易于阅读。您可以使用.CollectionChanged
之类的选项。此事件”在添加、删除、更改、移动项或刷新整个列表时发生"。这个问题,尤其是被接受的答案,都比标记的重复项更简单、更容易阅读,这很有意义。因此,我不是在跟踪整个集合,而是在跟踪特定的记录。当我实现您的建议时,set属性仅在项目未选中时才被执行。@softwareisfun Right。ItemsControl只关心集合中的项目。它将项目的显示交给项目模板,而项目模板的每个实例只关心它所拥有的项目的属性。在我的类中,我在其中创建模型。当我们执行fred.PropertyChanged+=OnItemPropertyChanged;@s时,OnItemPropertyChanged中将包含哪些代码OfTware有趣,这取决于您的目标。您可以在员工身上设置脏标志,以便知道以后需要保存该员工,和/或在主视图模型上设置脏标志,以指示某处需要保存。如果脏标志升起PropertyChanged
,则UI可以直观地指示需要保存;在应用程序上ose,您可以检查主脏标志并提示保存,也可以自动保存。每次属性更改时保存到DB可能会使UI陷入困境。只要在应用程序退出之前保存。这是一个针对特定需求的低使用率应用程序。我不希望有人取消选中/che
// Fred's not what you'd call active.
var fred = new Employee { Name = "Fred", activeDuty = false };
fred.PropertyChanged += OnItemPropertyChanged;
models.Add(fred);
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.
}