【问题标题】:Using a TabControl with a grouped CollectionViewSource将 TabControl 与分组的 CollectionViewSource 一起使用
【发布时间】:2016-10-26 15:07:48
【问题描述】:

我的 VM 公开了一个名为“Results”的属性,它是“Result”对象的 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!

非常感谢任何帮助。

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    很遗憾,您并没有走在正确的轨道上。 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多