如何检测 ObservableCollection<T> 中包含的项目的 属性 变化
How to detect property changes in items contained in ObservableCollection<T>
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 的帖子,但不明白其中的区别或为什么是优于另一个
ObservableCollection.CollectionChanged
在将项目添加到集合或从集合中删除时引发。 ObservableCollection
还实现了 INotifyPropertyChanged
,仅针对其 自己的个人属性 的更改发出通知——因此也会为其发出 PropertyChanged
事件Count
属性 当一个项目被添加或删除时(你现在没有理由关心它,但我们也可以把它扔在那里,因为它的价值)。
因此:当其中一个容器发生 属性 更改时,您的 Employee
的 ObservableCollection
不会引发任何事件,无论容器是否实现 [=14] =].容器 应该 实现 INotifyPropertyChanged
本身,并在它自己的 属性 值改变时引发事件——但是包含它的 ObservableCollection
不会监听那些事件。我们不需要绝对通知所有人绝对所有事情。
但是 您 确实需要知道 activeDuty
何时更改。简单。
当您创建新的 Employee
实例时,您可以使用 OnItemPropertyChanged
处理程序处理它们的 PropertyChanged
事件:
// Fred's not what you'd call active.
var fred = new Employee { Name = "Fred", activeDuty = false };
fred.PropertyChanged += OnItemPropertyChanged;
models.Add(fred);
如果 Employee
正确实施 INotifyPropertyChanged
,Fred 的 activity 水平的任何可检测到的增加都会立即在 OnItemPropertyChanged
中被察觉。 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
上。
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 的帖子,但不明白其中的区别或为什么是优于另一个
ObservableCollection.CollectionChanged
在将项目添加到集合或从集合中删除时引发。 ObservableCollection
还实现了 INotifyPropertyChanged
,仅针对其 自己的个人属性 的更改发出通知——因此也会为其发出 PropertyChanged
事件Count
属性 当一个项目被添加或删除时(你现在没有理由关心它,但我们也可以把它扔在那里,因为它的价值)。
因此:当其中一个容器发生 属性 更改时,您的 Employee
的 ObservableCollection
不会引发任何事件,无论容器是否实现 [=14] =].容器 应该 实现 INotifyPropertyChanged
本身,并在它自己的 属性 值改变时引发事件——但是包含它的 ObservableCollection
不会监听那些事件。我们不需要绝对通知所有人绝对所有事情。
但是 您 确实需要知道 activeDuty
何时更改。简单。
当您创建新的 Employee
实例时,您可以使用 OnItemPropertyChanged
处理程序处理它们的 PropertyChanged
事件:
// Fred's not what you'd call active.
var fred = new Employee { Name = "Fred", activeDuty = false };
fred.PropertyChanged += OnItemPropertyChanged;
models.Add(fred);
如果 Employee
正确实施 INotifyPropertyChanged
,Fred 的 activity 水平的任何可检测到的增加都会立即在 OnItemPropertyChanged
中被察觉。 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
上。