2008-11-06 48 views
14

我在帶有Parent和Children屬性的.edmx ADO.NET實體數據模型文件中有一個Page類。它適用於頁面層次結構。如何將LINQ to Entities使用WPF TreeView HierarchicalDataTemplate?

去除死ImageShack的鏈接 - ADO.NET實體框架層次Page類

這是在我的SQL數據庫頁表綁定到同一頁表的ID主鍵的ParentId外鍵處理。

如何在WPF TreeView中顯示此層次結構?

+0

您的圖片鏈接似乎已損壞。如果您仍然有原始圖像,請將其重新上傳到stack.imgur,或者編輯您的問題以使其在沒有圖像的情況下工作。謝謝。 – 2015-07-27 08:35:08

回答

16

我從Abe Heidebrecht得到這個工作的幫助。非常感謝他。

這裏是我的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> 

這裏是我的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 

當窗口負載,根節點和其子是從數據庫中查詢並插入進入樹。

每次展開節點時,都會從數據庫中查詢該節點的子孫,並將其插入樹中。

+1

有了這樣的代碼隱藏,您可以使用`DataTemplate`而不是`` – 0x49D1 2011-05-16 13:41:24

+0

here什麼是頁面管理器? – 2017-01-05 11:31:31

5

一種不同的方式:(很好,很相似,但略有不同)

在窗口中加載功能:

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

創建一個新的文件Page.cs

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

在您的XAML:

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

未經測試,但您應該瞭解一般想法。

1

第二種解決方案對我最有效。我有遞歸對象的列表,所以這是我使用了XAML:

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

每一個「庫」對象有幾個屬性(名稱,位置等)和「避難所」的泛型列表。