我的数据库中有一个表,其中有两列:
HID:等级制度
名称:字符串
在我的应用程序中,我有一个Node类,它只有这两个属性。我将数据导入Node实例化,并使用以下方式保存它们:
Dim Nodes As New List(Of Node)我知道这很管用,因为我已经查阅了数据。
我有一个wpf窗口,它上只有一个Treeview。在后面的代码中,我设置了窗口的上下文:
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
我已经重写了来自数据库的数据处理,以便树中的项具有树视图控件所需的子项。我还将我的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>.在我的treeview中,我看到了根节点,并且只看到了它下面的第一级。在第一个级别以下有几个级别没有显示出来。我做错了什么?
======================
编辑3:
我只有一节课:
PersonID: Long
ParentID: Long
PersonName: String
儿童:(人名)名单
我跟踪了所有项目的创建,通过观察它们是从我的数据库中对数据的后处理中创建的。正确地填充了这些类的各种实例。
例如,根据我最初发布的数据,约翰是一个例子,他有两个“孩子”,吉姆和玛丽。
=================================
编辑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的数据文本。就这样。
使用编辑2中显示的数据板,我应该在我的树视图中这样做:
Root
son1 of Root
son1 of son1但我没有。节点2没有展开来显示节点3。换句话说,我只看到以下内容:
Root
son1 of Root不用说,我不知道是怎么回事。
发布于 2017-01-22 13:31:34
应该将TreeView的TreeView属性绑定到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 ClassPrivate 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>

https://stackoverflow.com/questions/41775826
复制相似问题