2017-01-21 5 views
0

У меня есть таблица в моей базе данных, которая имеет два столбца:hierarchyid` в рекурсивных данных

HID: а `hierarchyid`

Имя: строка

В моем приложении у меня есть класс Node, который просто имеет эти два свойства. Импортировать данные в Node instantations и сохранить их все:

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: Я изменил ItemsSource в HierarchicalDataTemplate на:

ItemsSource="{Binding Path=HID}" 

и установить ItemTemplate самого Treeview к:

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>. 

В моей TreeView я вижу RootNode и только первый уровень ниже этого. Есть несколько уровней ниже первого уровня, которые не представлены. Что я делаю не так?

======================
Edit 3:
У меня есть только один класс:

PersonId: Длинные
ParentID: Длинные
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 

Я использую определение моего класса Person в Edit 3. Здесь я просто определить корневой узел и два другие узлы. Я добавляю node3 как дочерний узел в узел 2, затем добавляю узел 2 в качестве дочернего элемента в корневой узел и, наконец, добавляю корневой узел в список узлов, который затем устанавливается как datacontext для Treeview. Вот и все.

Используя DataTemplate, показанный в Edit 2, я должен иметь это в моем дереве:

Root 
    son1 of Root 
     son1 of son1 

, но я этого не делаю. Узел 2 не расширяется, чтобы показать узел 3. Другими словами, я просто вижу это:

Root 
    son1 of Root 

Излишне говорить, что я понятия не имею, что это неправильно.

+0

http://www.wpf-tutorial.com/treeview-control/treeview-data-binding-multiple-templates/ - если я правильно помню тип очень специфичен для связывания. – OneFineDay

+0

Я уже работал с этими примерами. Они не являются рекурсивными, что является именно камнем преткновения, с которым я не могу пройти. – SezMe

ответ

0

Вы должны привязать свойство ItemsSource 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> 

Edit:

Это должно работать нормально:

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

+0

Я устанавливаю ItemsSource в класс Nodes, который является List (of Node). – SezMe

+0

Ваш XAML создает список ВСЕХ узлов, потому что ВСЕ узлы являются корневыми узлами. В этом весь смысл рекурсии в данных. Таким образом, ваше предложение добавить дочерние узлы в класс Node невозможно, поскольку нет дочерних узлов NO. Это основная проблема, которую я не могу понять для отображения дерева. – SezMe

+0

Я не понимаю ... если нет дочерних узлов, как вы должны отображать дерево узлов? Если дочерних узлов нет, всегда будут только корневые узлы, так как ни один из корневых узлов не имеет дочернего узла. – mm8

Смежные вопросы