2

この方法の詳細に興味があります。プロパティの値の変更は、どのように、何によって追跡されますか?

4

2 に答える 2

4

Andrew Smithは、それについてのクールなブログ投稿を持っています。これはあなたに役立つと思います。

これについて私が見た解決策は、にアクセスし、 PropertyDescriptorそのAddValueChangedメソッドを 使用しEventHandlerて、プロパティが変更されたときに通知を受け取るためのを提供することです。場合によっては、応答が直接言及/使用DependencyPropertyDescriptor しますが、それは、それが表す基になるDependencyPropertyに関する追加情報を提供する派生PropertyDescriptorであるため、同じことです。このプロパティ記述子にはいくつかの方法でアクセスできますが、最も一般的なのは、TypeDescriptor.GetPropertiesメソッドから取得するか、DependencyPropertyDescriptor.FromPropertyを使用して取得することです。

このアプローチの問題は、オブジェクトがルート化されるため、GCによって収集されないことです。。フックイベント(特に静的イベント)がオブジェクトをルート化する方法については多くの議論がありましたので、ここでは詳しく説明しません。この場合、静的イベントをフックしているようには見えませんが、本質的にはフックしています。プロパティ記述子にハンドラーを追加すると、そのプロパティ記述子は、フックしているプロパティを持つオブジェクトによってキー設定されたハッシュテーブルにデリゲートを格納します。デリゲート/ハンドラーは基本的にオブジェクト上のメソッドへのポインターです(静的メソッドの場合はオブジェクトがありません)。つまり、プロパティ記述子には、オブジェクトと、監視している値を持つオブジェクトへの参照があります(ハッシュテーブルへのキーです)。

于 2012-12-10T08:33:09.620 に答える