Как я могу связать набор данных непосредственно с TreeView (с иерархией)? - PullRequest
0 голосов
/ 26 февраля 2009

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

Если у меня 4-уровневая иерархия, вот так:

<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"/>

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

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

Ответы [ 3 ]

1 голос
/ 22 марта 2009

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

BeaStollnitz

1 голос
/ 22 марта 2009

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

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

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

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

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

0 голосов
/ 11 марта 2009

Во-первых, вы должны установить ItemsSource для TreeView в 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 и т. Д.) Для отображения дополнительных данных.

...