具有混合类型和分类Sub-TreeViewItems的Databind WPF TreeView

时间:2011-11-08 16:56:54

标签: wpf xaml treeview

我正在尝试在WPF中构建具有类别的TreeView。

基本上结构如下:

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 个答案:

答案 0 :(得分:3)

麦克,

混合静态和模型数据可能无法满足您的需求。您必须创建一个包含静态节点等的实际ViewModel。 我强烈推荐Josh Smith's TreeView ViewModel tutorials。这是第一个,但请查看更多信息。他是该领域最知识渊博的开发人员之一。我们按照他的建议取得了巨大成功。