1

INotifyCollectionChangedオブジェクトにプロパティをアタッチするアタッチ プロパティ (静的クラスで宣言) があります。

プロパティが設定されたら、コレクションの変更の監視を開始し、コレクションが添付されているオブジェクトに対して何らかのアクションを実行したいと考えています。

最初の試み:

private static void MyProperty_OnChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
{
    // We need both the dependency object, and the collection args to process the notification
    NotifyCollectionChangedEventHandler changedFunc = (sender, eventArgs) => MyProperty_OnCollectionChanged( d, sender, eventArgs );

    if( e.OldValue != null )
        e.OldValue.CollectionChanged -= changedFunc;   // Can you see the bug?
    if( e.NewValue != null )
        e.NewValue.CollectionChanged += changedFunc;

}

dコレクションがアタッチされているオブジェクトをハンドラーに取得するために、クロージャーをプルします。簡単ですよね?

さて、ここでバグを見ることができると確信しています。コレクションが削除されるか、新しいコレクションに置き換えられると、changedFunc は別のクロージャーを持つ新しいハンドラーであるため、イベント ハンドラーの登録解除に失敗します。

それで、これを行う正しい方法は何ですか?

4

2 に答える 2

0

別の添付プロパティを使用して、イベントハンドラーとへの参照を含むプライベートオブジェクトを保持することで、これを解決しましたd。事実上、私は明示的にクロージャクラスを作成し、それへの参照を保持しています。

しかし、これは私にはかなり手間のかかるアプローチのようです。私は本当にもっとエレガントな解決策を探していました。

于 2011-12-09T09:32:21.223 に答える
0

あなたのコードからは、この静的メソッドがどこにあるのか明確ではありません。

イベント ハンドラーを、それが属するクラスのメンバー変数として格納する方法はありますか? これは、必要に応じて追加および削除できる特異な参照になります。現在、MyProperty_OnChanged が発生するたびに新しいイベント ハンドラーを作成しています。

または、コレクションを変更して、イベント ハンドラーへの参照を格納し、e.OldValue.OldHandler (または同様のもの) を介してアクセスできるようにして、後でアクセスできるようにすることはできますか?

于 2011-12-02T16:15:43.290 に答える