2008-11-06 7 views
14

내 .edmx ADO.NET 엔터티 데이터 모델 파일에 Parent 및 Children 속성이 포함 된 Page 클래스가 있습니다. 페이지의 계층 구조입니다.LINQ에 WPF TreeView HierarchicalDataTemplate을 사용하려면 어떻게해야합니까?

제거 죽은 ImageShack 링크 - 이것은 같은 페이지 테이블의 아이디 기본 키에 바인딩 된 페이지 테이블의 ParentId 외래 키 내 SQL 데이터베이스에 처리됩니다

ADO.NET 엔티티 프레임 워크 계층 페이지 클래스 .

이 계층 구조를 WPF TreeView에 어떻게 표시합니까?

+0

이미지 링크가 손상된 것 같습니다. 여전히 원본 이미지가있는 경우 stack.imgur에 다시 업로드하거나 질문을 편집하여 이미지없이 작동되게하십시오. 감사. –

답변

16

나는 Abe Heidebrecht의 도움으로이 작업을했습니다. 그에게 많은 감사. 여기 내 비주얼 베이직 코드의

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

여기 내 XAML은 ... ... 윈도우로드 루트 노드와 노드의 아이가 데이터베이스에서 쿼리 및 삽입

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

이러한 코드 숨김을 사용하면'' – 0x49D1

+0

여기 페이지 관리자 란 무엇입니까 ?? –

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> 

테스트되지 않았지만 일반적인 아이디어를 얻어야합니다.

+0

이 메서드는 전체 계층 구조를 한꺼번에로드합니다. 이전에 허용 된 대답은 자식 노드의 주문형로드입니다. –

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> 

각 '볼트'개체가 여러 속성 (이름, 위치 등)와 '볼트'의 일반적인 목록이 있습니다.