2008-11-06 5 views
14

Ich habe eine Page-Klasse in meiner .edmx ADO.NET-Entity-Datenmodell-Datei mit Eltern- und Kindereigenschaften. Es ist für eine Hierarchie von Seiten.Wie verwende ich ein WPF TreeView HierarchicalDataTemplate mit LINQ zu Entities?

entfernt tot Images Link - ADO.NET Entity Framework Hierarchical Seite Klasse

Dieser in meiner SQL-Datenbank auf die ID Primärschlüssel derselben Seite Tabelle gebunden mit einem ParentId Fremdschlüssel in der Seitentabelle behandelt wird .

Wie zeige ich diese Hierarchie in einem WPF TreeView an?

+0

Ihr Bildlink scheint gebrochen zu sein. Wenn Sie immer noch das Originalbild haben, laden Sie es bitte erneut auf stack.imgur hoch oder bearbeiten Sie einfach Ihre Frage, damit es ohne das Bild funktioniert. Vielen Dank. –

Antwort

16

Ich habe dies mit Hilfe von Abe Heidebrecht arbeiten. Vielen Dank an ihn.

Hier ist meine XAML ...

<Window x:Class="Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:PageManager" 
    Title="Window1" Height="300" Width="300" Name="Window1"> 
    <Grid> 
     <TreeView Margin="12" Name="TreeViewPages" ItemsSource="{Binding}" TreeViewItem.Expanded="TreeViewPages_Expanded"> 
      <TreeView.Resources> 
       <HierarchicalDataTemplate DataType="{x:Type local:Page}" ItemsSource="{Binding Children}"> 
        <TextBlock Text="{Binding Path=ShortTitle}" /> 
       </HierarchicalDataTemplate> 
      </TreeView.Resources> 
     </TreeView> 
    </Grid> 
</Window> 

Hier ist meine Visual Basic-Code ...

Class Window1 

    Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded 
     Dim db As New PageEntities 
     Dim RootPage = From p In db.Page.Include("Children") _ 
         Where (p.Parent Is Nothing) _ 
         Select p 
     TreeViewPages.ItemsSource = RootPage 
    End Sub 

    Private Sub TreeViewPages_Expanded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
     Dim ExpandedTreeViewItem As TreeViewItem = DirectCast(e.OriginalSource, TreeViewItem) 
     Dim PageId As Guid = DirectCast(ExpandedTreeViewItem.DataContext, Page).Id 
     Dim db As New PageEntities 
     Dim ChildPages = From p In db.Page.Include("Children") _ 
         Where p.Parent.Id = PageId _ 
         Select p 
     ExpandedTreeViewItem.ItemsSource = ChildPages 
    End Sub 
End Class 

Wenn die Fenster geladen wird, der Wurzelknoten und seine Kinder aus der Datenbank abgefragt werden und eingefügt in den Baum.

Jedes Mal, wenn ein Knoten erweitert wird, werden die Kinder und Enkel dieses Knotens aus der Datenbank abgefragt und in den Baum eingefügt.

+1

Mit solchen Codebehind können Sie 'DataTemplate' anstelle von' ' – 0x49D1

+0

hier Was ist Seitenmanager ?? –

5

Eine andere Art und Weise: (gut, sehr ähnlich, aber etwas anders)

in Ihrem Fenster Load-Funktion:

PageEntities db = new PageEntities(); 
TreeViewPages.ItemsSource = db.Page.Where(u=>u.Parent==null); 

Erstellen Sie eine neue Datei Page.cs

public partial class Page { 
    public ObjectQuery<Page> LoadedChildren { 
     get { 
      var ret = Children; 
      if(ret.IsLoaded==false) ret.Load(); 
      return ret; 
     } 
    } 
} 

In Ihr XAML:

<TreeView Name="TreeViewPages"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemSource="{Binding LoadedChildren}"> 
      <TextBlock Text="{Binding ShortTitle}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

Es ist nicht getestet, aber Sie sollten die allgemeine Idee bekommen.

+0

Diese Methode lädt die gesamte Hierarchie auf einmal. Die zuvor akzeptierte Antwort ist das On-Demand-Laden von Kindknoten. –

1

Zweite Lösung funktionierte am besten für mich. Ich habe eine Liste der rekursiven Objekte, so ist dies die XAML, die ich verwendet:

<TreeView Height="Auto" HorizontalAlignment="Stretch" Name="trvVaults" VerticalAlignment="Stretch" Width="Auto" Grid.Column="0" Margin="5"> 
    <!-- Treeview ItemsSource is loaded programmatically --> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Vaults}"> 
      <TextBlock Text="{Binding Name}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

Jedes ‚Vault‘ Objekt hat mehrere Eigenschaften (Name, Ort, usw.) und eine allgemeine Liste der ‚Vaults‘.