gpt4 book ai didi

wpf - 具有混合类型和分类子 TreeViewItems 的数据绑定(bind) WPF TreeView

转载 作者:行者123 更新时间:2023-12-04 19:08:58 25 4
gpt4 key购买 nike

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

基本上结构是这样的:

Root  
|_
| Cat A
|_
| Cat B
|_
Cat C

每个类别都绑定(bind)到一个单独的可观察集合。我的大部分类别都非常简单。作为类别的 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 具有静态 header 。然后该项目应该有一个显示名称的项目集合。对于原始父项的每个子项,应该有三个静态项,它们具有子项的动态列表。

写出来让我觉得这应该是一个非常简单的问题来解决。但是,在使用 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>

最佳答案

迈克,

混合静态数据和模型数据可能不会让您到达想要的位置。您必须创建一个包含静态节点等的实际 ViewModel。我强烈推荐Josh Smith's TreeView ViewModel tutorials .这是第一个,但请四处寻找更多信息。他是该主题上知识最渊博的开发人员之一。我们按照他的建议取得了巨大的成功。

关于wpf - 具有混合类型和分类子 TreeViewItems 的数据绑定(bind) WPF TreeView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8054162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com