我的虚拟机公开了一个名为' 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!
任何帮助都非常感激。
答案 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>