如何將WPF TreeView HierarchicalDataTemplate與LINQ to Entities一起使用?

data-binding entity-framework linq wpf xaml

我的.edmx ADO.NET實體數據模型文件中有一個帶有Parent和Children屬性的Page類。它適用於Pages的層次結構。

刪除死了ImageShack鏈接 - ADO.NET實體框架分層頁麵類

這是在我的SQL數據庫中處理的,其中Page表中的ParentId外鍵綁定到同一Page表的Id主鍵。

如何在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合法嗎? 是的,了解原因