Comment créer deux HierarchicalDataTemplate qui sont mutuellement référentielle dans Silverlight?
-
25-09-2019 - |
Question
Étant donné que:
- DataTemplates ne peuvent pas être affectés par TargetType
- Les références StaticResource ne peuvent faire référence précédemment
Comment peut-on modèle la situation suivante dans un TreeView?
class Resource {
public string Name {get;}
public IEnumerable<Property> Properties {get;}
}
class Property {
public string Name {get;}
public IEnumerable<Resource> Values {get;}
}
Cette structure se prête bien à un arbre qui ressemblerait à:
Resource 1
|- Property A
| - Resource 2
| - Resource 3
|- Property B
|- Resource 4
Ce serait trivial de modèle dans WPF en raison de la propriété TargetType
de HierarchicalDataTemplate
. Dans Silverlight, nous devons faire quelque chose comme:
<HierarchicalDataTemplate x:Key="ResourceTemplate"
ItemSource="{Binding Properties}"
ItemTemplate={StaticResource PropertyTemplate}" />
<HierarchicalDataTemplate x:Key="PropertyTemplate"
ItemSource="{Binding Values}"
ItemTemplate="{StaticResource ResourceTemplate}" />
Ce qui ne peut évidemment pas fonctionner parce que ResourceTemplate
ne peut pas faire référence à PropertyTemplate
parce qu'il est défini après dans le document XAML. Alors, comment allez-vous résoudre ce problème de la poule et de l'oeuf?
La solution
La seule solution raisonnable que j'ai trouvé est de créer un troisième type de ViewModel qui poserez des deux premiers types (ressources ou propriété) et des propriétés communes à se lier à: (par exemple les enfants). Ceci est toujours pas très optimale, cependant, si les deux types ont besoin de modèles très différents, car à ce moment-là, je me sers du VisualStateManager
pour basculer entre les modèles pour les données.
<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>