我的数据库中有一个表,它有两列:
HID:hierarchyid
名称:字符串
在我的应用程序中,我有一个Node类,它只有这两个属性。我将数据导入Node instantations并将它们全部保存为:
Dim Nodes As New List(Of Node)
我知道这很有效,因为我已经审核了这些数据。
我有一个只有Treeview的wpf窗口。在我后面的代码中,我设置了窗口的上下文:
DataContext = Nodes
现在我想用这些数据填充Treeview。这就是我做空的地方。我有:
<Window.Resources>
<HierarchicalDataTemplate
x:Key="MyTemplate"
ItemsSource="{Binding}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</Window.Resources>
<TreeView
ItemsSource ="{Binding Path=Name}"
ItemTemplate="{Binding Path=MyTemplate}">
</TreeView>
哪个不起作用。我哪里错了?
EDIT1:我将HierarchicalDataTemplate中的ItemsSource更改为:
ItemsSource="{Binding Path=HID}"
并将Treeview本身的ItemTemplate设置为:
ItemsSource ="{Binding}"
这看起来很直观但是会产生错误,说HID不是我的Node类的属性。咦?
Edit2:这是一些示例数据:
/ John
/1/ Jim
/2/ Mary
/1/1/ Sam
/1/1/1/ Nancy
/2/1/ Sharon
/2/1/1/ Joe
/2/1/1/1/ Henry
/2/1/1/1/ Ellen
/2/1/1/1/1/ Bart
================================
编辑2
我已经重写了对数据库中数据的处理,以便树中的项目具有Treeview控件所需格式的子项。我还将我的XAML更改为以下内容:
<Window.Resources>
<HierarchicalDataTemplate
x:Key="ChildTemplate">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate
x:Key="ParentTemplate"
ItemsSource="{Binding Path=ChildNodes}"
ItemTemplate="{StaticResource ChildTemplate}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</Window.Resources>
<TreeView
ItemsSource="{Binding}"
ItemTemplate="{StaticResource ParentTemplate}">
</TreeView>.
在我的树视图中,我看到了根节点,只有下面的第一层。第一级以下有几个级别未提供。我究竟做错了什么?
======================
编辑3:
我只有一个班级:
PersonID:长
ParentID:长
PersonName:String
儿童:人员名单
我通过观察从我的数据库中对数据进行后期处理来创建所有项目,从而跟踪了所有项目的创建。正确填充了各种类的实例。
使用我最初发布的数据,例如,John是一个实例,他有两个孩子&#34;,Jim和Mary
=================================
编辑4:
忘记我的数据库中的数据以及我用来处理数据的所有代码。我剥离了所有这些并用以下程序替换它,我只需手动定义3个节点:
Private Sub Window1_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
Dim RootNode As New Node With {.ID = 1, .ParentID = 0, .Name = "Root"}
Dim node2 As New Node With {.ID = 2, .ParentID = 1, .Name = "son1 of Root"}
Dim node3 As New Node With {.ID = 3, .ParentID = 2, .Name = "son1 of son1"}
node2.ChildNodes.Add(node3) 'Make node3 a child of node2
RootNode.ChildNodes.Add(node2) 'Make node2 a child of the root node
Nodes.Add(RootNode) 'Add the root node to the list of nodes
DataContext = Nodes 'Make that list my data context
End Sub
我在编辑3中使用Person类的定义。这里我只定义根节点和其他两个节点。我将node3作为子节点添加到节点2然后我将节点2作为子节点添加到根节点,最后我将根节点添加到节点列表,然后将其设置为Treeview的datacontext。就是这样。
使用编辑2中显示的datatemplate,我应该在树视图中显示:
Root
son1 of Root
son1 of son1
但我不知道。节点2不会展开以显示节点3.换句话说,我只看到这个:
Root
son1 of Root
毋庸置疑,我不知道出了什么问题。
答案 0 :(得分:0)
您应该将TreeView的ItemsSource属性绑定到List(Of Node)
。试试这个:
<TreeView ItemsSource="{Binding}">
<TreeView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
它应该使用根节点填充TreeView。
对于要显示的任何分层数据,您需要将ChildNodes属性添加到Node
类,并使用相应的子节点填充每个节点中的一个。那么使用HierarchicalDataTemplate
:
<HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
修改强>
这应该可以正常工作:
Public Class Node
Public Property Id As Integer
Public Property Name As String
Public Property ParentId As Integer
Public Property ChildNodes As List(Of Node) = New List(Of Node)
End Class
Private Sub Window1_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
Dim Nodes = New List(Of Node)
Dim RootNode As New Node With {.Id = 1, .ParentId = 0, .Name = "Root"}
Dim node2 As New Node With {.ID = 2, .ParentID = 1, .Name = "son1 of Root"}
Dim node3 As New Node With {.ID = 3, .ParentID = 2, .Name = "son1 of son1"}
node2.ChildNodes.Add(node3) 'Make node3 a child of node2
RootNode.ChildNodes.Add(node2) 'Make node2 a child of the root node
Nodes.Add(RootNode) 'Add the root node to the list of nodes
DataContext = Nodes 'Make that list my data context
End Sub
<TreeView ItemsSource="{Binding}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>