¿Cómo crear dos planificaciones jerárquicas que son mutuamente referenciales en Silverlight?
-
25-09-2019 - |
Pregunta
Dado que:
- TargetType no se puede asignar las plantillas de datos
- Las referencias de staticresource solo pueden referencia previamente
¿Cómo se plantilla la siguiente situación en una vista de árbol?
class Resource {
public string Name {get;}
public IEnumerable<Property> Properties {get;}
}
class Property {
public string Name {get;}
public IEnumerable<Resource> Values {get;}
}
Esa estructura se presta bien a un árbol que se vería:
Resource 1
|- Property A
| - Resource 2
| - Resource 3
|- Property B
|- Resource 4
Esto sería trivial plantado en WPF debido a la TargetType
propiedad de HierarchicalDataTemplate
. En Silverlight, tendríamos que hacer algo más como:
<HierarchicalDataTemplate x:Key="ResourceTemplate"
ItemSource="{Binding Properties}"
ItemTemplate={StaticResource PropertyTemplate}" />
<HierarchicalDataTemplate x:Key="PropertyTemplate"
ItemSource="{Binding Values}"
ItemTemplate="{StaticResource ResourceTemplate}" />
Que obviamente no puede funcionar porque ResourceTemplate
No puedo hacer referencia PropertyTemplate
Porque se define después del documento XAML. Entonces, ¿cómo resuelve este problema de pollo y huevo?
Solución
La única solución razonable que he encontrado es crear un tercer tipo ViewModel que envuelva cualquiera de los dos primeros tipos (recursos o propiedades) y proporcionará propiedades comunes para que se unan a: (por ejemplo, niños). Sin embargo, esto todavía no es muy óptimo, si los dos tipos necesitan plantillas muy diferentes porque en ese punto, estoy usando el VisualStateManager
Cambiar entre plantillas para los datos.
<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>