我正在尝试使我的树形视图按相似项将一组相似项分组。为了保持通用性,我的对象层次结构可能如下所示:
现在我的TreeView显示这些对象的方式与对象模型完全相同,但是我想为每种对象类型插入一个TreeView节点,使其看起来像这样:
我在类似的问题中看到有人建议使用两个单独的HierarchicalDataTemplates
,所以我为“对象组#1”级别创建了一个,其中包含一个带有类型列表的TreeView,但这确实很笨拙,因为它是在某些节点内的整个单独的TreeView。我也一直试图使用CollectionViewSource
来过滤出每个类别中的项目,但这对我没有多大帮助,因为我不知道如何显示它们。
我想我的问题可以归结为:如何使一个HierarchicalDataTemplate
组成为孩子?如果有人能指出正确的方向,我将不胜感激。
[如果有人想看,我可以发布一些代码,但是我实际上只是想弄清楚如何做我想做的事,所以我的代码现在只是一个非常简单的数据绑定树视图。
[看Sumi先生的this文章。我相信它将为您提供帮助。
您可以通过使用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 }
}
...
}
现在您的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>
[AFAIK,HierarchicalDataTemplate
无法对其子级进行分组。
视图应该只显示获取的所有内容,而无需真正深入研究对象的种类/组...为什么不在对象模型中创建这些组?
并且视图将变得像:
public interface ITreeNode
{
string Title;
IList<ITreeNode> ChildNodes;
}
并使用HierarchicalDataTemplate
显示。
如果这是您要查找的用于显示目的的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}"
... />