C# 如何将树视图中一个列表中的子对象分组?

C# 如何将树视图中一个列表中的子对象分组?,c#,wpf,treeview,hierarchicaldatatemplate,C#,Wpf,Treeview,Hierarchicaldatatemplate,我该如何列出一个列表,然后在一个树状视图组中按他们的班级列出它们?我读过,但它没有对子对象进行分组,而是在集合中具有相关属性 仓库 A型 亚型1 亚型2 B型 C型 如果我有一个包含所有这些类型的列表,我如何在树视图中显示分组 以前,我是手动添加它们的,一次添加一个TreeViewItem List<Warehouse> myWarehouse = new List<Warehouse>(); TreeViewItem WarehouseNode = new

我该如何列出一个列表,然后在一个树状视图组中按他们的班级列出它们?我读过,但它没有对子对象进行分组,而是在集合中具有相关属性

  • 仓库
    • A型
      • 亚型1
      • 亚型2
    • B型
    • C型
如果我有一个包含所有这些类型的列表,我如何在树视图中显示分组

以前,我是手动添加它们的,一次添加一个TreeViewItem

List<Warehouse> myWarehouse = new List<Warehouse>();
TreeViewItem WarehouseNode = new TreeViewItem() { Header = "Warehouse" };
TreeViewItem TypeANode = new TreeViewItem() { Header = "Type A" };
foreach(SubtypeA type in myWarehouse) {
    TypeANode.Items.Add(new TreeViewItem() { Header = type.Name };
}
WarehouseNode.Items.Add(TypeANode);
etc. for Type B and Type C.
我写了一个
DataTemplateSelector

class MyTemplateSelector : DataTemplateSelector {
    public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) {
        MethodInfo mi = container.GetType().GetMethod("FindResource") as MethodInfo;
        if(mi != null) {
            string strItem = item.ToString().Split('.').Last();
            switch(item.ToString().Split('.').Last()) {
                case "Type A":
                    return mi.Invoke(container, new object[] { "TypeATemplate" }) as DataTemplate;
                case "Type B":
                    return mi.Invoke(container, new object[] { "TypeBTemplate" }) as DataTemplate;
                case "Type C":
                    return mi.Invoke(container, new object[] { "TypeCTemplate" }) as DataTemplate;
            }

            return null;
        }

        return null;
    }
}
但现在,当我看树景时,它告诉我:

  • B型
  • B型
  • B型
  • C型
  • 等等

通过设置集合的CollectionViewSource对集合进行分组。您可以在代码中执行以下操作:

CollectionViewSource.GetDefaultView(yourCollection).GroupDescriptions.Add(
new PropertyGroupDescription("PropertyName"));
也可以在XAML中通过显式创建CollectionViewSource来实现

<CollectionViewSource
    Source="{StaticResource yourCollection}"
    xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework">
    <CollectionViewSource.GroupDescriptions>
        <dat:PropertyGroupDescription PropertyName="PropertyName"/>
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>


另外,还可以查看按
属性分组而不是按对象类型本身分组的

<CollectionViewSource
    Source="{StaticResource yourCollection}"
    xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework">
    <CollectionViewSource.GroupDescriptions>
        <dat:PropertyGroupDescription PropertyName="PropertyName"/>
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>