Wpf Treeview 分组

3

我有一个TreeView绑定到一个 List<MyCustomType>。我需要按照 MyType.MyGroupingProperty 进行分组显示,并将列表项本身显示为叶子。我该怎么做?

我尝试过的方法

由于我需要按照 MyType.MyGroupingProperty 进行分组显示,因此我创建了一个CollectionViewSource,将其绑定到TreeView并创建了HierarchicalDataTemplate:

<CollectionViewSource x:Key="cvs" Source="{Binding}">
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="MyGroupingProperty"/>
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

 <HierarchicalDataTemplate  DataType="{x:Type vm:DeviceViewModel}" ItemsSource="{Binding Items}" >
     <TextBlock Text="{Binding MyGroupingProperty}" />
 </HierarchicalDataTemplate>

目前为止,一切都很好。但是现在我无法显示项目,因为DataTemplate需要一个我已经使用过的类型,我收到了一个异常“key already added to dictionary”;如果我使用x:key也不起作用。

 <DataTemplate DataType="{x:Type vm:DeviceViewModel} >
      <TextBlock Text="{Binding AnotherProperty}" />
 </DataTemplate>
1个回答

3

由于您正在将TreeView绑定到组中,因此HierarchicalDataTemplate将处理它们而不是DeviceViewModel,因此模板应该类似于:

<HierarchicalDataTemplate ItemsSource="{Binding Path=Items}"  ItemTemplate="{StaticResource dataTemplate}">
      <TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>

完整的解决方案看起来像这样:
    <TreeView ItemsSource="{Binding Source={StaticResource yourCollection}, Path=Groups}" >
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Items}">
                <!--GroupItem.Name-->
                <TextBlock Text="{Binding Path=Name}" />
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                         <!--your item's property-->
                        <TextBlock Text="{Binding Path=Property}"/>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

希望能对您有所帮助。

顺便提一句,我不知道您需要将模板放在资源文件中,但当然是可行的。由于我没有看到您的代码,我只能猜测出错的原因,但我怀疑您指定了错误的目标类型,请尝试这样做:

 <TreeView.Resources>
            <HierarchicalDataTemplate ItemsSource="{Binding Items}" DataType="{x:Type CollectionViewGroup}">

剩下的部分与之前相同。如果模板类型与实际类型不同,将使用默认的数据呈现方式(文本块 + ToString())。

没错,但它也不起作用。你能否为我提供一个完整的可运行示例? - Mauro Sampietro
太好了,这个可行!如果我将HierarchicalDataTemplate放在TreeView.Resources中,我不明白为什么它不能工作。我想知道区别,但是此评论部分似乎太小了。 - Mauro Sampietro
太好了!我在想你是怎么发现的...在 MSDN 上看起来 Groups 和 Items 是 ReadOnlyObservableCollection<Object>.. 这似乎是我使用和记住 WPF 的主要原因,但我并没有真正学会它。 - Mauro Sampietro
FindResource() -> GetType() - Nadia Chibrikova
我知道问题已经解决,但每次需要将某些东西绑定到视图时都要使用GetType(),这让你开始感到烦恼了...这应该是文档的一部分,不是吗? - Mauro Sampietro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接