1

このサンプル クラスのいくつかのオブジェクトを含む BindingList (BindingList (of Foo)) があります。

Class Foo
Implements INotifyPropertyChanged

Private _name As String
Private _numer As Integer
Private _otherClass As OtherClass
Private _bindingListOfAnotherClass As BindingList (of AnotherClass)

End Class

この bindingList 内のアイテムのプロパティが変更されたときに、通知を受け取りたいと思います。

ご覧のとおり、インターフェイスを実装し、イベントもスローしています。ListChanged イベントは、プリミティブ プロパティに対してスローされますが、OtherClass または AnotherClass のプロパティが変更された場合 (または、_bindingListOfAnotherclass でアイテムが追加または削除された場合) にはスローされません。

また、OtherClass と AnotherClass で PropertyChanged イベントをスローしています。

何か案が?

4

1 に答える 1

1

残念ながら、Foo クラスが OtherClass がいつ変更されたかを知るための自動接続はありません。ただし、Foo がイベント ハンドラーを使用して OtherClass の PropertyChanged イベントをサブスクライブすることにより、そのイベントを具体的にリッスンする場合を除きます。そのイベント ハンドラーでは、Foo 自体でプロパティ変更イベントを発生させ、その OtherClass プロパティが変更されたことを伝えます。

プロパティが何らかの getter/setter で公開されている場合、オブジェクトの変更に応じて、オブジェクトのサブスクライブを解除して再サブスクライブする必要があるため、これは少し注意が必要です。

AnotherClass の BindingList の場合、BindingList は INotifyPropertyChanged を実装していないため、少し異なります。ListChanged イベントを持つ IBindingList を実装します。そのため、それを購読する必要があります。

AnotherClass が INotifyPropertyChanged を実装している限り、バインド リストは変更されたイベントを Foo にスローする必要があり、Foo は独自の PropertyChanged イベントをスローできます。

編集:

通常、イベントで常にサブスクライブしたい変更可能なプロパティを処理する方法は次のとおりです。

private Object _myObject;
public Object MyObject
{
    get
    {
        return _myObject;
    }
    set
    {
        if (_myObject != value)
        {
            if (_myObject != null)
                _myObject.PropertyChanged -= MyDelegate;

            _myObject = value;

            if (_myObject != null)
                _myObject.PropertyChanged += MyDelegate;
        }
    }
}

このようにして、null から値に安全に設定し、再び null に戻すことができ、イベント サブスクリプションが管理されます。

于 2013-09-24T20:41:07.163 に答える