2008-11-07 8 views
8

Ich habe eine Klasse mit Parent und Children Eigenschaften.WPF TreeView Binding

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

Ich mag diese Hierarchie in einem WPF-Treeview angezeigt werden soll.

Hier ist meine XAML ...

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

Und mein VB-Code ...

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

Aber dann habe ich nur einen Baum zwei Ebenen tief bekommen. Was muss ich tun, damit das funktioniert?

+0

damit verbundene Frage Siehe: http://stackoverflow.com/questions/269523/how-do-i-use-a-wpf-treeview-hierarchicaldatatemplate-with-linq-to-entities#273535 –

Antwort

11

Der Grund, warum dies nicht funktioniert, ist, dass Sie nur das DataTemplate für das TreeView angeben. Da die von TreeViewItems generierten TreeViewItems auch ItemsControls sind, müsste auch ItemTemplate festgelegt werden.

Der einfachste Weg, um das zu erreichen, was Sie erhoffen, ist, das HierarchicalDataTemplate in die Ressourcen der TreeView (oder eines seiner übergeordneten Visuals) zu setzen und den DataType der HierarchicalDataTemplate so einzustellen, dass er auf all Ihre Elemente angewendet wird .

In der Deklaration Ihres Containers (wahrscheinlichstes Fenster) müssen Sie eine Zuordnung zum Namespace definieren, in dem die Seite definiert ist.

z.B.

<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

data-type = "{x: Typ lokal: Seite}" gibt Fehler: (1) "Typ 'Seite' wurde nicht gefunden." und (2) "'local' ist ein nicht deklarierter Namensraum." –

+0

Sorry wegen der Verwirrung, ich habe die Antwort aktualisiert, um zu verdeutlichen, dass Sie eine xmlns-Deklaration hinzufügen müssen, um anzugeben, wo die Page-Klasse zu finden ist. –

+0

Vielen Dank. Ich habe xmlns: local = "clr-namespace: PageManager" hinzugefügt und die Knoten in der Baumstruktur werden nun templatiert. Aber ich bekomme immer noch nur zwei Ebenen tief einen Baum. –