Pregunta

Dado que:

  1. TargetType no se puede asignar las plantillas de datos
  2. 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?

¿Fue útil?

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top