Как я могу привязать набор данных непосредственно к TreeView (с иерархией)?

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

Если у меня четырехуровневая иерархия, например:

<HierarchicalDataTemplate x:Key="FirstLevelTemplate" ItemTemplate="{StaticResource SecondLevelTemplate}"/>
<HierarchicalDataTemplate x:Key="SecondLevelTemplate" ItemTemplate="{StaticResource ThirdLevelTemplate}"/>
<HierarchicalDataTemplate x:Key="ThirdLevelTemplate" ItemTemplate="{StaticResource FourthLevelTemplate}"/>
<DataTemplate x:Key="FourthLevelTemplate"/>

Какие свойства необходимо настроить для отображения моих данных непосредственно из DataSet?

edit: В идеале я хотел бы сделать это с помощью одного DataTable, ссылающегося на себя.

Ответов (3)

Решение

Я не думаю, что ты сможешь это сделать.

Элемент управления Treeview и HierarchicalDataTemplate ожидают иерархию объектов. DataSet по своей сути плоский.

Вам нужно будет каким-то образом преобразовать этот набор данных в иерархию объектов, каждый из которых имеет свою собственную коллекцию «Children». ItemsSource древовидной структуры будет привязан к «коллекции верхнего уровня» (строки без родительской ссылки).

Каждый HierarchicalDataTemplate будет иметь свойство ItemsSource, привязанное к соответствующему свойству Children.

Может быть решение с использованием конвертеров, но если оно существует, оно, вероятно, окажется более сложным, чем прямое изменение формы данных перед связыванием.

First, you would set the ItemsSource of the TreeView to the DataSet.

Затем вы должны установить для ItemTemplate TreeView значение FirstLevelTemplate.

ItemTemplate="{StaticResource FirstLevelTemplate}"

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

<HierarchicalDataTemplate x:Key="FirstLevelTemplate" ItemsSource="{Binding ChildItems}" ItemTemplate="{StaticResource SecondLevelTemplate}"/>

Измените «ChildItems», чтобы ссылаться на свойство в вашем DataSet, которое содержит дочерние элементы. Повторите это для каждого HierarchicalDataTemplate.

Наконец, вам нужно добавить элементы управления в шаблоны данных, чтобы отображать данные. Вот простой пример:

<DataTemplate x:Key="FourthLevelTemplate"/>
   <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="3">
      <TextBlock Text="{Binding DataProperty}"
                 HorizontalAlignment="Center" VerticalAlignment="Center"/>
   </Border>
</DataTemplate>

В этом случае вы должны заменить «DataProperty» на имя свойства вашего поля данных. Обратите внимание, что вы можете добавить другие элементы управления (например, TextBox, ComboBox и т. Д.) Для отображения дополнительных данных.

На этом сайте есть несколько очень хороших примеров использования treeview.

BeaStollnitz