C# 在WPF树视图中分组子对象

C# 在WPF树视图中分组子对象,c#,wpf,xaml,treeview,hierarchicaldatatemplate,C#,Wpf,Xaml,Treeview,Hierarchicaldatatemplate,我试图让我的树状视图根据相似项的内容对它们进行分组。为了保持通用性,我的对象层次结构可以如下所示: 物体 对象组#1 第1项(A类) 第2项(A类) 第3项(B类) 第4项(B类) 现在,我的TreeView显示的这些对象与对象模型完全相同,但我要做的是为每个对象类型插入一个TreeView节点,使其看起来像这样: 物体 对象组#1 A型 项目#1 项目#2 B型 项目#3 项目4 我在这里的一个类似问题中看到,有人建议使用两个独立的HierarchycalDat

我试图让我的树状视图根据相似项的内容对它们进行分组。为了保持通用性,我的对象层次结构可以如下所示:

  • 物体
    • 对象组#1
      • 第1项(A类)
      • 第2项(A类)
      • 第3项(B类)
      • 第4项(B类)
现在,我的TreeView显示的这些对象与对象模型完全相同,但我要做的是为每个对象类型插入一个TreeView节点,使其看起来像这样:

  • 物体
    • 对象组#1
      • A型
        • 项目#1
        • 项目#2
      • B型
        • 项目#3
        • 项目4
我在这里的一个类似问题中看到,有人建议使用两个独立的
HierarchycalDataTemplates
,因此我为“Object Group#1”级别创建了一个,其中包含一个带有类型列表的树视图,但这确实很笨拙,因为它在某些节点中是一个完整的独立树视图。我还尝试使用
CollectionViewSource
来过滤每个类别中的项目,但这对我没有多大帮助,因为我不知道如何显示它们

我想我的问题可以归结为:如何创建一个
hierarchycaldatatemplate
group它的子对象?如果有人能给我指出正确的方向,我将不胜感激


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

AFAIK,
HierarchycalDataTemplate
无法对其子级进行分组

视图应该只显示它得到的任何内容,而不真正深入挖掘对象种类/组。。。为什么不在对象模型中创建这些组

而视图将只显示smth,如:

public interface ITreeNode
{
    string Title;
    IList<ITreeNode> ChildNodes;  
}
公共接口ITreeNode
{
字符串标题;
IList子节点;
}

并使用层次结构数据模板显示它

看看Sumi先生的文章。我相信它会对您有所帮助。

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

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 }
  }
  ...
}

如果这是一个简单的分组方法,从一个平面集合为显示目的,您正在寻找可能使用“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}"
... />


这正是我需要看到的。谢谢。
选择新建{Type=item.Type,Items=g}不编译;可能
选择新的{Type=g.First().Type,Items=g}?集合视图源是否更合适?
<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}"
... />