Wpf 树视图分组
Wpf Treeview grouping
我有一个绑定到 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 需要一个我已经使用过的类型,我得到一个异常 'key already added to dictionary';如果我使用 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>
希望对您有所帮助。
P.S。我不知道您需要将模板放在资源中,但这是可能的。由于我没有看到你的代码,我只能猜测出了什么问题,但我怀疑你指定了错误的目标类型,试试这个:
<TreeView.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding Items}" DataType="{x:Type CollectionViewGroup}">
其余同理。如果模板的类型与实际类型不同,它将使用默认的数据呈现方式(文本块 + ToString()
)。
我有一个绑定到 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 需要一个我已经使用过的类型,我得到一个异常 'key already added to dictionary';如果我使用 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>
希望对您有所帮助。
P.S。我不知道您需要将模板放在资源中,但这是可能的。由于我没有看到你的代码,我只能猜测出了什么问题,但我怀疑你指定了错误的目标类型,试试这个:
<TreeView.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding Items}" DataType="{x:Type CollectionViewGroup}">
其余同理。如果模板的类型与实际类型不同,它将使用默认的数据呈现方式(文本块 + ToString()
)。