8

DependencyObjectおよび で使用されるプロパティ継承ツリー (または継承コンテキスト) に関する十分な情報を見つけるのに苦労していますDependencyProperty

オブジェクト A が論理的な親オブジェクト B であるように、典型的な WPF ページの外側の値継承機能を使用したいと思いDependencyPropertyます。したがって、オブジェクト A のプロパティに割り当てられた値は、ローカルにない限り、オブジェクト B に自動的に伝達されます。 set (FlowDirectionプロパティが WPF で機能するのと少し似ています)。

オブジェクト A とオブジェクト B が から派生しDependencyObject、a の子ではない場合UIElement (つまり、オブジェクト A はそれ自身のルートDependencyPropertyです)、 B が A の子であることを理解するように論理ツリーをどのように確立しますか?

Hillberg Freezable TrickJosh Smith の一連のトリックは 、私が探しているものとはまったく異なります。既存の要素ツリーからプロパティを取得したくありません... 独自の視覚的でない要素ツリーを作成したい... つまり、継承コンテキストを制御したいのです。

この一連の知識がどこに隠れているか知っている人はいますか?

4

2 に答える 2

11

多くの調査と のソース コードの混乱の後DependencyObject、ここに短い答えがあります。

(InheritenceContextインスタンスの論理的な親を明らかにするプロパティ) は (の有用な実装の 90% のようにDependencyObject) 内部としてマークされているため、WindowsBase.dll の外部のすべてのコードから隠されています。

リフレクションを使用して_contextParentフィールドを設定したり、この隠しメソッドを呼び出してを設定したりすることは可能ですInheritenceContextが、結局のところ、それはクリーンなソリューションではありません。

ソースコードを精査した後DependencyObject、私は感銘を受けていないと言わざるを得ません. DependencyObject非常にクリーンでユビキタスな再利用可能なクラスである可能性があり、そうあるべきでした。代わりに、構造的および動作的にその継承者にバインドされ、特定の定数、フィールド、メソッド、および Freezable を残りのサブクラスと共存させるための回避策も含まれています。これは、優れた OO 設計から遠く離れているだけでなく、また、それ以外の場合は優れたクラスを、WPF フレームワークの外ではまったく使用できなくなります。

于 2009-03-06T08:12:51.177 に答える
0

値自体をオーバーライドしない子への値の伝播について質問していると思います。

子を持つ WPF 要素の概念は、ContentControl私の知る限り導入されています。これは、あなたが行きたいよりもはるかに下の階層に作用します。したがって、単純にそこから派生した場合DependencyObject、この動作はマニフェストにならないと思います。

具体的には、特定のプロパティの値がない場合、子は親に尋ねることを知る必要があります。

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

于 2009-03-05T13:28:58.147 に答える