2

私は持っていObservableCollection<CustomClass>ます。CustomClassにはいくつかのプロパティがあります。それらの1つが呼び出され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 に答える