C#-Wpf树视图分组

我有一个绑定到List< MyCustomType>的TreeView.我需要显示按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需要一种我已经使用过的类型,并且我得到一个异常“密钥已经添加到字典中”;如果我使用x:key也不起作用.

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

解决方法:

当您将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()).

上一篇:python-打开并创建记录不起作用的树视图odoo / openerp


下一篇:CodeGo.net>在树视图中更改子节点的背景色