我正在尝试在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>
答案 0 :(得分:3)
麦克,
混合静态和模型数据可能无法满足您的需求。您必须创建一个包含静态节点等的实际ViewModel。 我强烈推荐Josh Smith's TreeView ViewModel tutorials。这是第一个,但请查看更多信息。他是该领域最知识渊博的开发人员之一。我们按照他的建议取得了巨大成功。