Come creare due HierarchicalDataTemplates che si escludono a-referenziale in Silverlight?
-
25-09-2019 - |
Domanda
Premesso che:
- DataTemplates non possono essere assegnati TargetType
- riferimenti StaticResource possono solo fare riferimento in precedenza
Come si fa a modello la seguente situazione in un TreeView?
class Resource {
public string Name {get;}
public IEnumerable<Property> Properties {get;}
}
class Property {
public string Name {get;}
public IEnumerable<Resource> Values {get;}
}
Questa struttura si presta bene ad un albero che sarebbe simile:
Resource 1
|- Property A
| - Resource 2
| - Resource 3
|- Property B
|- Resource 4
Questa sarebbe banale per modello in WPF a causa della proprietà di TargetType
HierarchicalDataTemplate
. In Silverlight, avremmo dovuto fare qualcosa di più simile a:
<HierarchicalDataTemplate x:Key="ResourceTemplate"
ItemSource="{Binding Properties}"
ItemTemplate={StaticResource PropertyTemplate}" />
<HierarchicalDataTemplate x:Key="PropertyTemplate"
ItemSource="{Binding Values}"
ItemTemplate="{StaticResource ResourceTemplate}" />
Il che, ovviamente, non può lavoro perché non può ResourceTemplate
riferimento PropertyTemplate
perché è definito dopo che nel documento XAML. Quindi, come si fa a risolvere questo problema di pollo e uova?
Soluzione
L'unica soluzione ragionevole che ho trovato è quello di creare un terzo tipo ViewModel che avvolgere uno dei primi due tipi di risorse (o di proprietà) e di fornire proprietà comuni di legarsi a: (per esempio bambini). Questo non è ancora molto ottimale, però, se i due tipi hanno bisogno di modelli molto diversi, perché a quel punto, sto usando la VisualStateManager
per passare da modelli per i dati.
<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>