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

aal*_*675 7 c# wpf treeview xaml hierarchicaldatatemplate

我试图让我的树视图按照它们是什么来组合类似项目的集合.为了保持通用性,我的对象层次结构可能如下所示:

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

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

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

我在这里看到一个类似的问题,有人建议有两个单独的,HierarchicalDataTemplates所以我创建了一个'对象组#1'级别,其中包含一个带有类型列表的TreeView,但这真是笨拙,因为它是一个完整的单独的TreeView里面一些节点.我也一直在尝试使用a CollectionViewSource来过滤掉每个类别中的项目,但这对我来说并不是很好,因为我无法弄清楚如何显示它们.

我想我的问题归结为:我如何组成一个HierarchicalDataTemplate小组呢?如果有人能指出我正确的方向,我会非常感激.

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

Ray*_*rns 7

你可以通过绑定ItemsSource你的HierarchicalDataTempalate使用来达到这个效果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 }
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

现在您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>
Run Code Online (Sandbox Code Playgroud)


Nat*_*txo 5

看看Sumi先生的这篇文章.我相信它会对你有所帮助.