Wie verwende ich eine WPF-TreeView-HierarchicalDataTemplate mit LINQ to Entities?

data-binding entity-framework linq wpf xaml

Frage

Ich habe eine Page-Klasse in meiner .edmx ADO.NET Entity Data Model-Datei mit übergeordneten und untergeordneten Eigenschaften. Es ist für eine Hierarchie von Seiten.

tote ImageShack-Verknüpfung entfernt - ADO.NET Entity Framework - Hierarchische Seitenklasse

Dies wird in meiner SQL-Datenbank mit einem Fremdschlüssel ParentId in der Page-Tabelle behandelt, der an den ID-Primärschlüssel derselben Seitentabelle gebunden ist.

Wie zeige ich diese Hierarchie in einer WPF-TreeView an?

Akzeptierte Antwort

Diese Arbeit bekam ich mit Hilfe von Abe Heidebrecht . Vielen Dank an ihn.

Hier ist mein 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>

Hier ist mein Visual Basic-Code ...

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

Wenn das Fenster geladen wird, werden der Stammknoten und seine untergeordneten Elemente aus der Datenbank abgefragt und in die Baumstruktur eingefügt.

Jedes Mal, wenn ein Knoten erweitert wird, werden die Kinder und Enkel dieses Knotens aus der Datenbank abgefragt und in den Baum eingefügt.


Beliebte Antwort

Ein anderer Weg: (sehr ähnlich, aber etwas anders)

In Ihrer Window Load-Funktion:

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

Erstellen Sie eine neue Datei Page.cs

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

In deiner XAML:

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

Es ist nicht getestet, aber Sie sollten die allgemeine Idee bekommen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum