Я пытаюсь построить TreeView в WPF, который имеет категории.
В основном структура выглядит следующим образом:
Root
|_
| Cat A
|_
| Cat B
|_
Cat C
Каждая категория связана с отдельной наблюдаемой коллекцией.Большинство моих категорий очень просты.TreeViewItem, который является категорией, имеет свой ItemsSource установленный, и никакой иерархии нет.Тем не менее, у меня есть категория, которую необходимо представить в специальной иерархии.
Изображение, которое "Cat C" в приведенном выше дереве затем выглядит следующим образом:
Servers
|_
| [SERVER A's DISPLAY NAME]
| |_
| | Namespaces
| | |_
| |_ [NAMESPACE alpha's DISPLAY NAME]
| | Deployments
| | |_
| |_ [DEPLOYMENT 1's DISPLAY NAME]
|_ Configuration File
[SERVER B's DISPLAY NAME]
По сути, чтоЯ хочу, чтобы жестко закодированный родительский TreeViewItem имел статический заголовок.Этот элемент должен иметь коллекцию элементов с указанием их названий.Для каждого дочернего элемента исходного родителя должно быть три статических элемента с динамическим списком дочерних элементов.
Запись этого заставляет меня думать, что это должна быть очень упрощенная проблема, которую нужно решить.Однако после нескольких дней игры с XAML я не могу заставить работать иерархию.Ниже самое дальнее, что я смог получить.Я использовал составную коллекцию под названием Children, чтобы объединить пространства имен, развертывания и файл конфигурации в одну коллекцию.Однако я не могу их выделить.
<TreeViewItem ItemsSource="{Binding Path=Configuration.Servers}"
IsExpanded="True" >
<TreeViewItem.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}">
<Setter Property="IsExpanded" Value="True"/>
</Style>
</TreeViewItem.ItemContainerStyle>
<TreeViewItem.HeaderTemplate>
<DataTemplate>
<Border Margin="0,2,2,0">
<StackPanel Orientation="Horizontal">
<Image Source="/WPF;component/Images/server_chart.png"
Margin="0,0,5,0"/>
<TextBlock Text="Cognos Servers" />
</StackPanel>
</Border>
</DataTemplate>
</TreeViewItem.HeaderTemplate>
<TreeViewItem.Resources>
<HierarchicalDataTemplate ItemSource="{Binding Path=Children}" DataType="{x:Type local:Server}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}" >
<Setter Property="IsExpanded" Value="True"/>
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding DisplayName}" PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Refresh" Click="TreeItemMenu_AddNewClient">
<MenuItem.Icon>
<Image Source="/WPF;component/Images/arrow_refresh.png" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Add Client..." Click="TreeItemMenu_AddNewClient" />
<Separator />
<MenuItem Header="Remove" Click="TreeItemMenu_RemoveClick">
<MenuItem.Icon>
<Image Source="/WPF;component/Images/server_delete.png" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Clients}" DataType="{x:Type local:Namespace}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}" >
<Setter Property="IsExpanded" Value="True"/>
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding DisplayName}" PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type local:Client}">
<TextBlock Text="{Binding DisplayName}"
ContextMenu="{StaticResource ResourceKey=ContextMenuTreeItem}"
PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown" />
</DataTemplate>
</TreeViewItem.Resources>