2008-11-07 15 views
8

Tengo una clase con propiedades para padres e hijos.WPF TreeView Enlace

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

Quiero mostrar esta jerarquía en una vista de árbol de WPF.

Aquí está mi XAML ...

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

Y mi código de 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 

Pero entonces solo me dan un árbol de dos niveles de profundidad. ¿Qué debo hacer para que esto funcione?

+0

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

Respuesta

11

La razón por la que esto no está funcionando es que solo está especificando DataTemplate para TreeView. Como TreeViewItems que genera también son ItemsControls, también necesitarían tener el conjunto ItemTemplate.

La manera más fácil de lograr lo que está esperando es poner HierarchicalDataTemplate en los recursos de TreeView (o cualquiera de sus imágenes principales) y establecer el DataType de HierarchicalDataTemplate para que se aplique a todos sus elementos .

En la declaración de su contenedor (ventana más probable), debe definir una asignación al espacio de nombre donde se define la página.

p. Ej.

<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

Tipo de datos = "{x: tipo local: página}" da errores: (1) "Tipo 'Página' no se encontró". y (2) "'local' es un espacio de nombres no declarado". –

+0

Disculpe la confusión, he actualizado la respuesta para aclarar que necesita agregar una declaración xmlns para especificar dónde encontrar la clase de página. –

+0

Gracias. Agregué xmlns: local = "clr-namespace: PageManager" y ahora está creando plantillas para los nodos en el árbol. Pero todavía tengo un árbol de dos niveles de profundidad. –