2008-11-07 9 views
8

J'ai une classe avec les propriétés Parent et Enfants.WPF TreeView Binding

ADO.NET Entity Framework Hierarchical Page Class http://img148.imageshack.us/img148/6802/edmxxe8.gif

Je veux afficher cette hiérarchie dans un TreeView WPF.

Voici mon XAML ...

<TreeView Margin="12" Name="TreeViewPages" ItemsSource="{Binding}"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Path=ShortTitle}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

Et mon code VB ...

 
Dim db As New PageEntities 
Dim t = From p In db.Page.Include("Children") _ 
     Where p.Parent Is Nothing _ 
     Select p 
TreeViewPages.ItemsSource = t 

Mais je ne reçois un arbre deux niveaux de profondeur. Que dois-je faire pour que cela fonctionne?

+0

Voir question connexe: http://stackoverflow.com/questions/269523/how-do-i-use-a-wpf-treeview-hierarchicaldatatemplate-with-linq-to-entities#273535 –

Répondre

11

La raison pour laquelle cela ne fonctionne pas est que vous spécifiez uniquement DataTemplate pour TreeView. Étant donné que les TreeViewItems qu'il génère sont aussi ItemsControls, ils doivent également avoir le SetTemplate. Le moyen le plus simple d'obtenir ce que vous espérez est de placer HierarchicalDataTemplate dans les ressources de TreeView (ou l'un de ses visuels parent) et de définir le DataType du HierarchicalDataTemplate afin qu'il soit appliqué à tous vos éléments .

Dans la déclaration de votre conteneur (fenêtre la plus probable), vous devez définir un mappage vers l'espace de noms où la page est définie.

par exemple.

<Window ... 
    xmlns:local="clr-namespace:NamespaceOfPageClass;assembly=AssemblyWherePageIsDefined"> 

<TreeView Margin="12" Name="TreeViewPages" ItemsSource="{Binding}" /> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType=”{x:Type local:Page}” ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Path=ShortTitle}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 
+0

DataType = "{x: Type local: Page}" donne des erreurs: (1) "Type 'Page' n'a pas été trouvé." et (2) "local" est un espace de noms non déclaré. " –

+0

Désolé pour la confusion, j'ai mis à jour la réponse pour clarifier que vous devez ajouter une déclaration xmlns pour spécifier où trouver la classe Page. –

+0

Merci. J'ai ajouté xmlns: local = "clr-namespace: PageManager" et il modèle les nœuds sur l'arbre maintenant. Mais je n'ai toujours qu'un arbre à deux niveaux de profondeur. –