2009-02-27 6 views
0

J'ai une structure arborescente à 4 niveaux, défini par:Puis-je envelopper automatiquement les éléments HierarchicalDataTemplate dans un TreeViewItem?

<HierarchicalDataTemplate DataType="{x:Type src:Level1}" ItemsSource="{Binding Path=Level2Items}"> 
    <TextBlock Text="{Binding Path=Level1Name}"/> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate DataType="{x:Type src:Level2}" ItemsSource="{Binding Path=Level3Items}"> 
    <TextBlock Text="{Binding Path=Level2Name}"/> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate DataType="{x:Type src:Level3}" ItemsSource="{Binding Path=Level4Items}"> 
    <TextBlock Text="{Binding Path=Level3Name}"/> 
</HierarchicalDataTemplate> 
<DataTemplate DataType="{x:Type src:Level4}"> 
    <TextBlock Text="{Binding Path=Level4Name}"/> 
</DataTemplate> 

Et il fonctionne très bien. La seule chose est, je ne peux pas sélectionner par programme aucun de mes éléments liés, parce qu'ils ne sont pas de type TreeViewItem (et n'ont donc pas la propriété "IsSelected"). Existe-t-il un moyen d'envelopper automatiquement les éléments de la base de données dans un type de conteneur particulier (dans ce cas: TreeViewItem)?

Répondre

3

Si vos articles sont en TreeView, ils seront enveloppés dans un TreeViewItem automatiquement par l » ItemContainerGenerator du TreeView. Vous pouvez faire quelque chose comme ceci pour assurer la propriété IsSelected sur TreeViewItem cartes à une propriété sur votre classe de données:

<TreeView> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="IsSelected" Value="{Binding MyIsSelectedProperty}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+0

Malheureusement, votre hypothèse que les éléments liés seront emballés automatiquement dans un TreeViewItem n'est pas vrai dans mon cas (pour quelque raison que ce soit). L'appel de GetType() sur le premier élément de la collection Items de TreeView renvoie mon type, pas de type "TreeViewItem". Des pensées? Merci!! – Pwninstein

+0

La collection Items contient vos éléments comme prévu. L'arbre visuel, cependant, enveloppe votre article dans un conteneur. Pour TreeViews, le conteneur est un TreeViewItem. –

+0

Kent a absolument raison. Chaque élément est enveloppé dans un ItemContainer, décrit par la propriété ItemContainerStyle. Pour un TreeView, le conteneur par défaut est un TreeViewItem. Consultez l'article de blog du Dr WPF sur ItemContainers: http://drwpf.com/blog/Home/tabid/36/EntryID/32/Default.aspx – Adrian

Questions connexes