14

親と子のプロパティを持つ .edmx ADO.NET Entity Data Model ファイルに Page クラスがあります。これは、ページの階層用です。

無効な ImageShack リンクを削除 - ADO.NET Entity Framework Hierarchical Page Class

これは、同じ Page テーブルの Id 主キーにバインドされた Page テーブルの ParentId 外部キーを使用して、私の SQL データベースで処理されます。

この階層を WPF TreeView に表示するにはどうすればよいですか?

4

3 に答える 3

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

ウィンドウがロードされると、ルート ノードとその子ノードがデータベースからクエリされ、ツリーに挿入されます。

ノードが展開されるたびに、そのノードの子と孫がデータベースから照会され、ツリーに挿入されます。

于 2008-11-07T20:25:44.773 に答える
5

別の方法: (よく似ていますが、少し異なります)

Window Load 関数で:

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>

テストされていませんが、一般的な考え方は理解できるはずです。

于 2009-03-17T01:38:41.700 に答える
1

2番目の解決策が私にとって最もうまくいきました。再帰オブジェクトのリストがあるため、これが使用した 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>

各 'Vault' オブジェクトには、いくつかのプロパティ (名前、場所など) と 'Vaults' の一般的なリストがあります。

于 2011-01-29T20:35:06.687 に答える