8

我试图让我的树视图按它们是什么来对一组相似的项目进行分组。为了保持通用性,我的对象层次结构可能如下所示:

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

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

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

我在这里看到一个类似的问题,有人建议有两个单独HierarchicalDataTemplates的,所以我为“对象组#1”级别创建了一个,其中包含一个带有类型列表的 TreeView,但这真的很笨拙,因为它是一个完全独立的 TreeView 内部的一些节点。我也一直在尝试使用 aCollectionViewSource过滤掉每个类别中的项目,但这对我来说并不是很好,因为我不知道如何显示它们。

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

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

4

4 回答 4

7

ItemsSource您可以通过在您的HierarchicalDataTempalateusing上绑定 来实现此效果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>
于 2010-02-12T10:55:14.837 回答
7

看看Sumi先生的这篇文章。我相信它会帮助你。

文章要点:

我对这个问题的解决方案需要以下要素:

  • 允许您组合不同绑定的 MultiBinding。
  • 一个转换器,可以帮助我们在必要时将不同的绑定集合组织到子文件夹中。
  • 当然还有:提供绑定数据的可视化表示的数据模板。
于 2010-02-12T10:03:18.967 回答
0

AFAIK,HierarchicalDataTemplate不能将它的孩子分组。

视图应该只显示它​​得到的任何东西,而不是真正深入研究对象种类/组......你为什么不在你的对象模型中创建这些组?

并且视图将变得像:

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

并使用HierarchicalDataTemplate.

于 2010-02-11T23:01:41.933 回答
0

如果这是您正在寻找的用于显示目的的平面集合中的简单分组方法,则使用“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}"
... />
于 2015-06-16T00:09:09.643 回答