質問

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 から単純に派生させる場合、この動作は現れないと想定します。

具体的には、子は、特定のプロパティの値がないかどうかを親に尋ねる必要があります。

興味深い質問。完全な答えも知りたい。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top