在WPF TreeView中对子对象进行分组

问题描述 投票:7回答:4

我正在尝试使我的树形视图按相似项将一组相似项分组。为了保持通用性,我的对象层次结构可能如下所示:

  • 对象
    • 对象组#1
      • 项目1(类型'A')
      • 项目2(类型'A')
      • 第3项(B型)
      • 第4项(B型)

现在我的TreeView显示这些对象的方式与对象模型完全相同,但是我想为每种对象类型插入一个TreeView节点,使其看起来像这样:

  • 对象
    • 对象组#1
      • A型
        • 项目#1
        • 项目#2
      • B型
        • 项目#3
        • 项目#4

我在类似的问题中看到有人建议使用两个单独的HierarchicalDataTemplates,所以我为“对象组#1”级别创建了一个,其中包含一个带有类型列表的TreeView,但这确实很笨拙,因为它是在某些节点内的整个单独的TreeView。我也一直试图使用CollectionViewSource来过滤出每个类别中的项目,但这对我没有多大帮助,因为我不知道如何显示它们。

我想我的问题可以归结为:如何使一个HierarchicalDataTemplate组成为孩子?如果有人能指出正确的方向,我将不胜感激。

[如果有人想看,我可以发布一些代码,但是我实际上只是想弄清楚如何做我想做的事,所以我的代码现在只是一个非常简单的数据绑定树视图。

c# wpf xaml treeview hierarchicaldatatemplate
4个回答
5
投票

[看Sumi先生的this文章。我相信它将为您提供帮助。


7
投票

您可以通过使用ItemsSourceHierarchicalDataTempalate绑定到IValueConverter上来实现此效果。该转换器仅执行以下操作:

public class MyConverter : IValueConverter
{
  public object Convert(object value, ...)
  {
    return
      from item in (IEnumerable<MyItem>)value
      group item by item.Type into g
      select new { Type = g.Key, Items = g }
  }
  ...
}

现在您的HierarchcialDataTemplate可以如下:

<HierarchicalDataTemplate ItemsSource="{Binding SomePath, Converter={x:Static local:MyConverter}">

  <HierarchicalDataTemplate.ItemTemplate>
    <HierarchicalDataTemplate
      ItemsSource="{Binding Items}"
      TargetType="{x:Type local:MyItem}"

      ItemTemplate="{StaticResource MyItemTemplate}">
         <!-- may omit ItemTemplate in prior line to use implicit template -->

      <TextBlock Text="{Binding Type}" /> <!-- Header for type -->

    </HierarchicalDataTemplate>
  </HierarchicalDataTemplate.ItemTemplate>

  <!-- header for "Object Group #1" -->

</HierarchicalDataTemplate>

0
投票

[AFAIK,HierarchicalDataTemplate无法对其子级进行分组。

视图应该只显示获取的所有内容,而无需真正深入研究对象的种类/组...为什么不在对象模型中创建这些组?

并且视图将变得像:

public interface ITreeNode
{
    string Title;
    IList<ITreeNode> ChildNodes;  
}

并使用HierarchicalDataTemplate显示。


0
投票

如果这是您要查找的用于显示目的的Flat Collection中的简单分组方法,则也许更适合使用“ CollectionViewSource”。由于属性/集合更改事件的传播,使用LINQ可能成为噩梦。

<CollectionViewSource x:Key="GroupedItems" Source="{Binding ItemsSource,  ElementName=My_UserControl}">
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Type" Converter="{StaticResource GroupingConverter}" />
    </CollectionViewSource.GroupDescriptions>
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="Date"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

<HierarchicalDataTemplate x:Key="GroupDataTemplate"  ItemsSource="{Binding Items}" >
    <TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>

<TreeView x:Name="ItemHolder" x:FieldModifier="private"
    ItemsSource="{Binding Source={StaticResource GroupedItems}, Path=Groups}"
... />
© www.soinside.com 2019 - 2024. All rights reserved.