2008-11-06 8 views
14

Mam klasy Strona w pliku .edmx ADO.NET Entity Data Model z właściwościami Parent i Children. Dotyczy hierarchii stron.Jak używać WPD TreeView HierarchicalDataTemplate z LINQ do encji?

usunięte Link martwy ImageShack - ADO.NET Entity Framework Class hierarchiczne Page

ta jest obsługiwana w mojej bazy danych SQL przy użyciu klucza obcego w tabeli parentId strony wiąże się z podstawowym kluczem id tym samym stole strony .

Jak wyświetlić tę hierarchię w TreeView WPF?

+0

Link do obrazu wydaje się być uszkodzony. Jeśli nadal masz oryginalny obraz, prześlij go ponownie do pliku stack.imgur lub po prostu edytuj pytanie, aby działało bez obrazu. Dzięki. –

Odpowiedz

16

Mam to działa z pomocą Abe Heidebrecht. Wielkie dzięki dla niego.

Oto mój 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> 

Oto mój kodu Visual Basic ...

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 

Po załadowaniu okna, węzeł główny i jego dzieci są pytani z bazy danych i wstawiony do drzewa.

Za każdym razem, gdy węzeł jest rozszerzany, dzieci i wnuki tego węzła są przeszukiwane z bazy danych i wstawiane do drzewa.

+1

Przy takim kodziebe można użyć 'DataTemplate' zamiast' ' – 0x49D1

+0

tutaj Co to jest menedżer stron? –

5

inny sposób: (dobrze, bardzo podobny, ale nieco inny)

W funkcji obciążenia Okno:

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

Utwórz nowy plik Page.cs

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

W Twój XAML:

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

To nie jest testowane, ale powinieneś uzyskać ogólny pomysł.

+0

Ta metoda ładuje całą hierarchię za jednym razem. Poprzednio zaakceptowaną odpowiedzią jest ładowanie węzłów potomnych na żądanie. –

1

Drugie rozwiązanie sprawdziło się najlepiej. Mam listę obiektów rekurencyjnych, więc jest to XAML, że użyłem:

<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> 

Każdy obiekt „Vault” ma kilka właściwości (nazwa, lokalizacja, itp) i rodzajowe listy "skarbców.

Powiązane problemy