我有一个绑定到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需要一个我已经使用的类型,并且我得到一个异常&#39;密钥已经添加到字典&#39 ;;如果我使用x:键它也不起作用。
<DataTemplate DataType="{x:Type vm:DeviceViewModel} >
<TextBlock Text="{Binding AnotherProperty}" />
</DataTemplate>
答案 0 :(得分: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>
希望它有所帮助。
P.S。我不知道你需要模板资源,但它有可能。由于我还没有看到你的代码,我只能猜到错误,但我怀疑你指定了错误的目标类型,试试这个:
<TreeView.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding Items}" DataType="{x:Type CollectionViewGroup}">
其余的都是一样的。如果模板的类型与真实类型不同,它将使用默认的数据呈现方式(文本块+ ToString()
)。