使用带有分组CollectionViewSource的TabControl

时间:2016-10-26 15:07:49

标签: wpf xaml

我的虚拟机公开了一个名为' Results'的属性,它是一个ObservableCollection'结果'对象:

public class Result
{
    public string CategoryName { get; set; }
    public string Description { get; set; }
}

只有少数几个独特的类别,但每个类别可能会有很多个别结果。

在我的XAML中,我已将此属性包装在CollectionViewSource中,并在' CategoryName'上应用分组:

<UserControl.Resources>
    <CollectionViewSource x:Key="resultsCollection"
                          Source="{Binding Results}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="CategoryName" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</UserControl.Resources>

我想做什么(假设可能),创建一个TabControl,每个类别都有一个标签,并且标签的标题文本被设置为CategoryName。在每个TabItem中,我想要一个ItemsControl,只需填充每个项目的描述(属于该类别)。

目前,我甚至都在努力让标签项目正常运行。我最接近的是:

<TabControl ItemsSource="{Binding Source={StaticResource resultsCollection}}">
    <TabControl.GroupStyle>
        <GroupStyle>
             <GroupStyle.HeaderTemplate>
                 <DataTemplate>
                     <TextBlock Text="{Binding Name}" />
                 </DataTemplate>
             </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </TabControl.GroupStyle>
</TabControl>

假设我甚至在正确的轨道上,所有这些产生的是一个水平列表TextBlocks,其中的标签应该是,但它们不起作用,可点击的标签。

我不知道从哪里开始在每个TabItem中获取ItemsControl!

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:2)

不幸的是,你并没有走上正轨。 TabControl功能基于作为TabItem控件的项容器。但是在使用GroupStyle的情况下,表示组的每个项都包含在GroupItem控件中,这会破坏TabControl功能。

此处的关键信息是{Binding Source={StaticResource resultsCollection}}实际评估为ICollectionView对象(通常为ListCollectionView)。所以这里的解决方案是绑定到ICollectionView.Groups属性,该属性包含第一级组项(CollectionViewGroup个对象)。然后,您可以通过指定TabControl.ContentTemplate并绑定到CollectionViewGroup.Items集合来列出分组的项目。

这是实现目标的最低要求:

<TabControl ItemsSource="{Binding Groups, Source={StaticResource resultsCollection}}">
    <TabControl.ContentTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding Items}" DisplayMemberPath="Description" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>