2

我有一个ObservableCollection<CustomClass>. CustomClass 有一些属性。其中之一被称为Name字符串类型。整个事情都绑定到 WPF 数据网格。现在,当集合的任何成员的名称发生更改时,我需要得到通知。CollectionChanged集合的事件不会被触发。我可以实施INotifyPropertyChanged,但我在哪里听呢?

4

2 回答 2

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  
}
于 2012-11-15T13:21:43.973 回答
1

您需要对 ObservableCollection 中的每个项目实施 INotifyPropertyChanged。

于 2012-11-15T13:23:56.733 回答