递归数据的HierarchyID

时间:2017-01-21 04:44:09

标签: wpf vb.net treeview

我的数据库中有一个表,它有两列:

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

毋庸置疑,我不知道出了什么问题。

1 个答案:

答案 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>

enter image description here