2

TreeView から継承し、項目コンテナーとして TreeViewItems を使用するカスタム PropertyGrid コントロールのさまざまなテーマを作成しようとしています。さらに、TreeViewItem がバインドされているオブジェクトの種類に基づいて、TreeViewItem のコントロール テンプレートを設定したいと考えています。ItemsSource を設定して、現在のように PropertyGrid を設定したいと思います。

現在、HierarchialDataTemplate を介して TreeViewItems.ItemContainerStyleSelector を設定することにより、バインドされたオブジェクトのタイプに基づいてさまざまなコントロール テンプレートを適用しています。このスタイル セレクターでは、リソース キーを介して静的リソースを返しています。このセレクターとリソース キー メソッドを使用するのではなく、バインド先のオブジェクトの型に基づいて異なる派生 TreeViewItem オブジェクトを作成したいと考えています。これにより、他のコントロールのテーマと同じように、タイプに基づいてテーマごとに異なるスタイルを適用できます。しかし、これを行う方法がわかりません。オーバーライド ItemsControl.GetContainerForItemOverride は、バインドされるオブジェクト、または少なくともその型が渡された場合に、私が望むことを行いますが、これを機能させる方法がわかりません。これを行う方法についてのアイデアはありますか?それとも、私は彼のことをすべて間違っているのでしょうか?

4

1 に答える 1

1

最善の策は、読み取り専用のカスタム依存関係プロパティをカスタム TreeViewItem に追加することです。より適切な名前がないため、これを「Look」と呼びましょう。このプロパティは、適用するさまざまな外観またはスタイルを含む列挙型にすることができます。

次に、カスタム TreeViewItem の単一のスタイルを作成できます。これは、Look プロパティに基づいてスタイル トリガーを使用して、テンプレートまたはその他のさまざまなプロパティを変更します。

次に、指定されたアイテムに基づいて、 PrepareContainerForItemOverrideでLook プロパティを設定できます。

一般に、ItemsControl は「コンテナー」が単一の型であることを想定していますが、これは厳密には強制されていません。しかし、あなたが言ったように、それが包んでいるアイテムに基づいて異なるコンテナを作成することはできません.

さらに、仮想化により、ミックスが少し複雑になります。その場合、コンテナは再利用される可能性があるため、プロパティ タイプの新しいコンテナを「作成」する機会はありません。ただし、仮想化が有効になっている場合でも、PrepareContainerForItemOverride が呼び出されます。

于 2011-04-28T00:24:28.040 に答える