Silverlightで相互に参照される2つの階層datatemplatesを作成する方法は?
-
25-09-2019 - |
質問
とすれば:
- dataTemplatesはターゲットタイプで割り当てることはできません
- stateCresource参照は以前にのみ参照できます
TreeViewで次の状況をどのようにテンプレートしますか?
class Resource {
public string Name {get;}
public IEnumerable<Property> Properties {get;}
}
class Property {
public string Name {get;}
public IEnumerable<Resource> Values {get;}
}
その構造は、次のように見える木に十分に役立ちます。
Resource 1
|- Property A
| - Resource 2
| - Resource 3
|- Property B
|- Resource 4
これは、WPFのテンプレートに些細なことです。 TargetType
の財産 HierarchicalDataTemplate
. 。 Silverlightでは、次のようなことをしなければなりません。
<HierarchicalDataTemplate x:Key="ResourceTemplate"
ItemSource="{Binding Properties}"
ItemTemplate={StaticResource PropertyTemplate}" />
<HierarchicalDataTemplate x:Key="PropertyTemplate"
ItemSource="{Binding Values}"
ItemTemplate="{StaticResource ResourceTemplate}" />
明らかに機能することはできません ResourceTemplate
参照できません PropertyTemplate
XAMLドキュメントで定義されているためです。それでは、この鶏と卵の問題をどのように解決しますか?
解決
私が見つけた唯一の合理的な解決策は、最初の2つのタイプ(リソースまたはプロパティ)のいずれかをラップし、以下に結合する共通のプロパティを提供する3番目のViewModelタイプを作成することです(例:子供)。ただし、2つのタイプが非常に異なるテンプレートを必要としている場合、その時点で、 VisualStateManager
データのテンプレートを切り替えます。
<HierarchicalDataTemplate x:Key="TreeItemTemplate"
ItemSource="{Binding Children}">
<ContentPresenter Content="{Binding}">
<VisualStateManager.Groups>
<VisualStateGroup>
<VisualState Name="IsResource">
<!-- set resource template -->
</VisualState>
<VisualState Name="IsProperty">
<!-- set property template -->
</VisualState>
</VisualStateGroup>
</VisualStateManager.Groups>
</ContentPresenter>
</HierarchicalDataTemplate>
所属していません StackOverflow