Wpf Treeview分组

时间:2015-02-04 16:44:25

标签: c# wpf treeview

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

1 个答案:

答案 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())。