我有一个绑定到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()).