我有ObservableCollection<CustomClass>
。 CustomClass有一些属性。其中一个名为Name
,类型为字符串。整个事情都绑定到WPF数据网格。现在,我需要在更改集合的任何成员的名称时收到通知。不会触发集合的CollectionChanged
事件。我可以实现INotifyPropertyChanged
但我应该在哪里听呢?
答案 0 :(得分:6)
您确实需要在自定义类上实现INotifyPropertyChanged,并且需要订阅集合中所有对象的PropertyChanged事件。如果属性已更新,您将收到有关该单个对象更改的通知。
如果您想查看旧值和新值是什么,那么您需要创建自己的PropertyChanged事件(可能将其命名为PropertyUpdated以防止出现混淆)。 像下面的东西。如果您实现此事件(如自定义类显示),并使用此事件而不是INotifyPropertyChanged,那么您在处理事件时可以访问事件参数中更新属性的旧值和新值。
public class PropertyUpdatedEventArgs: PropertyChangedEventArgs {
public PropertyUpdatedEventArgs(string propertyName, object oldValue, object newValue): base(propertyName) {
OldValue = oldValue;
NewValue = newValue;
}
public object OldValue { get; private set; }
public object NewValue { get; private set; }
}
public interface INotifyPropertyUpdated {
event EventHandler<PropertyUpdatedEventArgs> PropertyUpdated;
}
public MyCustomClass: INotifyPropertyUpdated {
#region INotifyPropertyUpdated members
public event EventHandler<PropertyUpdatedEventArgs> PropertyUpdated;
private void OnPropertyUpdated (string propertyName, object oldValue, object newValue) {
var propertyUpdated = PropertyUpdated;
if (propertyUpdated != null) {
propertyUpdated(this, new PropertyUpdatedEventArgs(propertyName, oldValue, newValue));
}
}
#endregion
#region Properties
private int _someValue;
public int SomeValue {
get { return _someValue; }
set {
if (_someValue != value) {
var oldValue = _someValue;
_someValue = value;
OnPropertyUpdated("SomeValue", oldValue, SomeValue);
}
}
}
#endregion
}
答案 1 :(得分:1)
您需要对ObservableCollection中的每个项目实现INotifyPropertyChanged。