首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归数据的HierarchyID

递归数据的HierarchyID
EN

Stack Overflow用户
提问于 2017-01-21 04:44:08
回答 1查看 293关注 0票数 0

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

HID:等级制度

名称:字符串

在我的应用程序中,我有一个Node类,它只有这两个属性。我将数据导入Node实例化,并使用以下方式保存它们:

代码语言:javascript
复制
Dim Nodes As New List(Of Node)

我知道这很管用,因为我已经查阅了数据。

我有一个wpf窗口,它上只有一个Treeview。在后面的代码中,我设置了窗口的上下文:

代码语言:javascript
复制
DataContext = Nodes

现在我想用这些数据填充Treeview。这就是我缺钱的地方。我有:

代码语言:javascript
复制
<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更改为:

代码语言:javascript
复制
ItemsSource="{Binding Path=HID}"

并将Treeview本身的ItemTemplate设置为:

代码语言:javascript
复制
ItemsSource ="{Binding}"

这在直觉上似乎是对的,但是会产生错误,说HID不是我的Node类的属性。哈?

Edit2:以下是一些示例数据:

代码语言:javascript
复制
/ 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更改为:

代码语言:javascript
复制
<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个节点:

代码语言:javascript
复制
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中显示的数据板,我应该在我的树视图中这样做:

代码语言:javascript
复制
Root
    son1 of Root
        son1 of son1

但我没有。节点2没有展开来显示节点3。换句话说,我只看到以下内容:

代码语言:javascript
复制
Root
    son1 of Root

不用说,我不知道是怎么回事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-22 13:31:34

应该将TreeView的TreeView属性绑定到List(Of Node)。试试这个:

代码语言:javascript
复制
<TreeView ItemsSource="{Binding}">
    <TreeView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

它应该用根节点填充TreeView。

要显示任何分层数据,需要向ChildNodes类添加一个Node属性,并使用相应的子节点填充每个节点中的一个。那么使用HierarchicalDataTemplate就有意义了。

代码语言:javascript
复制
<HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
    <TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>

编辑:

这应该工作得很好:

代码语言:javascript
复制
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
代码语言:javascript
复制
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
代码语言:javascript
复制
<TreeView ItemsSource="{Binding}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41775826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档