Привязка данных WPF TreeView со смешанными типами и категориями Sub-TreeViewItems - PullRequest
3 голосов
/ 08 ноября 2011

Я пытаюсь построить 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>

1 Ответ

3 голосов
/ 08 ноября 2011

Майк,

Сочетание статических и модельных данных, вероятно, не приведет вас туда, куда вы хотитеВам нужно будет создать фактическую модель представления, содержащую статические узлы и т. Д. Я настоятельно рекомендую руководства Джоша Смита по TreeView ViewModel .Это первый, но посмотрите вокруг для получения дополнительной информации.Он является одним из самых знающих разработчиков на эту тему.Мы последовали его рекомендациям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...