gpt4 book ai didi

c# - 什么是带有 CollectionViewGroup 分组的惯用 XAML TreeView?

转载 作者:太空狗 更新时间:2023-10-29 21:57:09 25 4
gpt4 key购买 nike

我有一个看起来像这样的 TreeView:

<TreeView Grid.Row="1" x:Name="InspectionResultsTreeView"
ItemsSource="{Binding Source={StaticResource InspectionTypeGroupViewSource}, Path=Groups}"
ItemTemplate="{StaticResource InspectionTypeGroupsTemplate}">
</TreeView>

ItemsSource 是一个名为 InspectionTypeGroupViewSource 的键控资源:

<CollectionViewSource x:Key="InspectionTypeGroupViewSource" Source="{Binding Results}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Inspection.InspectionType" />
<PropertyGroupDescription PropertyName="Inspection" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

这个小东西的作用是取ViewModel的Results属性:

private ObservableCollection<ICodeInspectionResult> _results;

public ObservableCollection<ICodeInspectionResult> Results
{
get { return _results; }
set { _results = value; OnPropertyChanged(); }
}

...并将其分组为两个级别 - 首先按 InspectionType,然后按 Inspection - 结果是具有检查类型、检查和然后是个别检查结果。在这一点上,屏幕截图可能有助于可视化我猜:

Rubberduck 2.0 Code Inspections toolwindow

因此,InspectionResultsTreeViewItemTemplate 是另一个键控资源,名称为 InspectionTypeGroupsTemplate - 这是粗体“检验类”项目:

<HierarchicalDataTemplate x:Key="InspectionTypeGroupsTemplate" 
DataType="{x:Type CollectionViewGroup}"
ItemsSource="{Binding Items}"
ItemTemplate="{StaticResource InspectionGroupsTemplate}">

<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
Text="{Binding Name}"
FontWeight="Bold"
TextWrapping="NoWrap"/>
<TextBlock Margin="4,0,4,0"
VerticalAlignment="Center"
Text="{Binding ItemCount, StringFormat=({0})}"
TextWrapping="NoWrap"/>
</StackPanel>
</HierarchicalDataTemplate>

并且该模板的 ItemTemplate 是一个 InspectionGroupsTemplate - 这是单独的检查,带有“严重性”图标:

<HierarchicalDataTemplate x:Key="InspectionGroupsTemplate"
DataType="{x:Type CollectionViewGroup}"
ItemsSource="{Binding Items}"
ItemTemplate="{StaticResource InspectionResultTemplate}">

<StackPanel Orientation="Horizontal">
<Image Style="{StaticResource IconStyle}"
Source="{Binding Name, Converter={StaticResource InspectionIconConverter}}"
VerticalAlignment="Center" />
<TextBlock Margin="4"
VerticalAlignment="Center"
Text="{Binding Name, Converter={StaticResource InspectionDescriptionConverter}}"
TextWrapping="NoWrap"/>
<TextBlock Margin="0,4,0,4"
VerticalAlignment="Center"
Text="{Binding ItemCount, StringFormat=({0})}"
TextWrapping="NoWrap"/>
</StackPanel>
</HierarchicalDataTemplate>

最后,这个分组的ItemTemplate是一个InspectionResultTemplate,针对每一个单独的检测结果:

<DataTemplate x:Key="InspectionResultTemplate" 
DataType="{x:Type inspections:ICodeInspectionResult}">
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
Margin="4"
Text="{Binding Name}"
TextWrapping="NoWrap"/>
</StackPanel>
</DataTemplate>

ICodeInspectionResult 接口(interface)有一个 string Name 属性,我在这里使用它;此 Name 不同于分组级别中使用的 Name,它是一个 object CollectionViewGroup.Name - 的基础类型>Name 是分组的名称,因此级别 1 是 InspectionType,级别 2 是Inspection

问题是我使用的转换器比我认为需要的要多,以转换此 object Name 并访问我需要访问和显示的成员...但是,我需要显示每个分组中的项目数,所以 DataType 应该是 CollectionViewGroup...对吗?

如果不借助转换器来显示所有需要显示的内容,我该如何做到这一点?这应该如何完成?我能找到的每个 TreeView/CollectionViewGroup 教程都是一个简单的实现。

最佳答案

您遇到了 XAML 的标志性问题:它几乎结构化。

惯用的解决方案是编写自定义 WPF 用户控件。 (如何以及在其中包含什么由您决定。)WPF 用户控件的目标是消除重复的 XAML 标记和逻辑。您可以在用户控件中包含您的转换器,并从您的主控件中删除转换器。

关于在 WPF 中创建 UserControl 对象的教程很多,所以我不会在这里详细介绍。


至于 Converter 问题:这几乎是最惯用的方式。每个转换器都是可重复使用的,并且只专注于一种源类型。除了考虑将支持相同源类型的转换器合并在一起之外,您无能为力。 (转换器具有 Type targetType 参数和 object 参数 是有原因的。)

关于c# - 什么是带有 CollectionViewGroup 分组的惯用 XAML TreeView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32597777/

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