DependencyObject継承ツリーのカスタマイズ
-
03-07-2019 - |
質問
DependencyObject
および DependencyProperty
で使用されるプロパティ継承ツリー(または継承コンテキスト)に関する十分な情報を見つけるのに苦労しています。
オブジェクトAが論理親オブジェクトBであり、したがってオブジェクトAのプロパティに割り当てられた値であるように、典型的なWPFページの外部で DependencyProperty
の値継承機能を使用したいローカルで設定されていない限り、オブジェクトBに自動的に伝播します(WPFでは FlowDirection
プロパティに少し似ています)。
オブジェクトAとオブジェクトBが DependencyObject
から取得され、が UIElement
の子ではない場合(つまり、オブジェクトAはそれは独自の root )であり、それから DependencyProperty
がBがAの子であることを理解するように論理ツリーをどのように確立しますか?
Hillberg Freezable Trick としてジョシュスミスのトリックバッグは、私が探しているものとはまったく異なりますにとって。既存の要素ツリーからプロパティを取得したくない ...視覚的ではない独自の要素ツリーを作成したい...つまり、継承コンテキストを制御したい
この知識体系がどこに隠れているか知っていますか?
解決
よく調べて DependencyObject
のソースコードをいじくり回した後、ここに簡単な答えがあります:
InheritenceContext
(インスタンスの論理的な親を明らかにするプロパティ)は( DependencyObject
の有用な実装の90%のように)内部としてマークされているため、非表示になっていますWindowsBase.dll以外のすべてのコードから
リフレクションを使用して _contextParent
フィールドを設定したり、この隠しメソッドを呼び出して InheritenceContext
を設定したりできますが、クリーンなソリューションではありません。
DependencyObject
のソースコードを精査した後、私は感銘を受けていないと言わざるを得ません。 DependencyObject
は、非常にクリーンで、どこにでもある、再利用可能なクラスである可能性があり、そうあるべきでした。
代わりに、構造的および動作的にその継承者にバインドされ、特定の定数、フィールド、メソッド、および回避策を含めて、Freezableが残りのサブクラスと共存できるようにします。また、WPFフレームワークの外部では、他の点では優れたクラスをまったく使用できなくなります。
他のヒント
値自体をオーバーライドしない子への値の伝播について尋ねていると仮定します。
子を持つWPF要素の概念は、私の知る限り ContentControl
によって導入されています。これは、階層のさらに下の方に行くと思います。したがって、 DependencyObject
から単純に派生させる場合、この動作は現れないと想定します。
具体的には、子は、特定のプロパティの値がないかどうかを親に尋ねる必要があります。
興味深い質問。完全な答えも知りたい。