我在带有Parent和Children属性的.edmx ADO.NET实体数据模型文件中有一个Page类。它适用于页面层次结构。如何将LINQ to Entities使用WPF TreeView HierarchicalDataTemplate?
去除死ImageShack的链接 - ADO.NET实体框架层次Page类
这是在我的SQL数据库页表绑定到同一页表的ID主键的ParentId外键处理。
如何在WPF TreeView中显示此层次结构?
我在带有Parent和Children属性的.edmx ADO.NET实体数据模型文件中有一个Page类。它适用于页面层次结构。如何将LINQ to Entities使用WPF TreeView HierarchicalDataTemplate?
去除死ImageShack的链接 - ADO.NET实体框架层次Page类
这是在我的SQL数据库页表绑定到同一页表的ID主键的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
当窗口负载,根节点和其子是从数据库中查询并插入进入树。
每次展开节点时,都会从数据库中查询该节点的子孙,并将其插入树中。
有了这样的代码隐藏,您可以使用`DataTemplate`而不是`
here什么是页面管理器? – 2017-01-05 11:31:31
一种不同的方式:(很好,很相似,但略有不同)
在窗口中加载功能:
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>
未经测试,但您应该了解一般想法。
第二种解决方案对我最有效。我有递归对象的列表,所以这是我使用了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>
每一个“库”对象有几个属性(名称,位置等)和“避难所”的泛型列表。
您的图片链接似乎已损坏。如果您仍然有原始图像,请将其重新上传到stack.imgur,或者编辑您的问题以使其在没有图像的情况下工作。谢谢。 – 2015-07-27 08:35:08