WPF TreeView HierarchicalDataTemplate과 LINQ to Entities를 어떻게 사용합니까?

data-binding entity-framework linq wpf xaml

문제

.edmx ADO.NET 엔터티 데이터 모델 파일에 Parent 및 Children 속성이 포함 된 Page 클래스가 있습니다. 페이지의 계층 구조입니다.

죽은 ImageShack 링크 제거 - ADO.NET Entity Framework 계층 적 페이지 클래스

이것은 내 SQL 데이터베이스에서 동일한 페이지 테이블의 Id 기본 키에 바인딩 된 Page 테이블의 ParentId 외래 키를 사용하여 처리됩니다.

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

수락 된 답변

나는이 일을 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

윈도우가로드되면 루트 노드와 그 자식 노드가 데이터베이스에서 쿼리되어 트리에 삽입됩니다.

노드가 확장 될 때마다 해당 노드의 자식과 손자가 데이터베이스에서 쿼리되어 트리에 삽입됩니다.


인기 답변

다른 방법 : (아주 비슷하지만 약간 다르다)

창로드 기능 :

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>

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



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.