Question

Étant donné que:

      
  1. DataTemplates ne peuvent pas être affectés par TargetType   
  2. 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?

Était-ce utile?

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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top