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

C# 如何检测ObservableCollection中包含的项目的属性更改<;T>;,c#,wpf,xaml,observablecollection,C#,Wpf,Xaml,Observablecollection,我从未使用过ObservableCollection,有人能告诉我如何检测activeDuty字段是否被修改?(我做了一些挖掘,看到了许多关于OnCollectionChanged和OnItemProperty Changed的帖子,但我不明白它们之间的区别,也不明白为什么一个比另一个更受欢迎。ObservableCollection。CollectionChanged是在向集合中添加或从集合中删除项目时引发的。ObservableCollection也在otifyPropertyChanged

我从未使用过ObservableCollection,有人能告诉我如何检测activeDuty字段是否被修改?(我做了一些挖掘,看到了许多关于OnCollectionChanged和OnItemProperty Changed的帖子,但我不明白它们之间的区别,也不明白为什么一个比另一个更受欢迎。
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.
}