我需要将itemscontrol的主要组显示为标签。
有一个ItemsControl.GroupStyle属性,包含GroupStyle和GroupStyle.Panel属性。
本质上我想实现这个目标:
<ItemsControl>
<ItemsControl.GroupStyle>
<GroupStyle>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<TabControl/> <!-- (1) -->
</ItemsPanelTemplate>
</GroupStyle.Panel>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<TabItem Header="{Binding Name}"> <!-- (2) -->
<TabItem.Content>
<ItemsPresenter />
</TabItem.Content>
</TabItem>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ItemsControl.GroupStyle>
</ItemsControl>
不幸的是,这有两个问题:
答案 0 :(得分:1)
到目前为止我发现的部分解决方案是使用TabControl与ItemsSource绑定到CollectionView.Groups并在TabControl.ContentTemplate内部使用绑定到当前组的ItemsControl项目:
<TabControl ItemsSource="{Binding MyItems, Converter={StaticResource CollectionToViewGroupsConverter}}"
SelectedIndex="0">
<TabControl.ContentTemplate>
<DataTemplate>
<ContentControl>
<ItemsControl ItemsSource="{Binding Items}"/>
</ContentControl>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
转换器在哪里:
public class CollectionToViewGroupsConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var view = CollectionViewSource.GetDefaultView(value);
if (view == null)
return null;
return view.Groups;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
不幸的是,这是另一个模板的所有部分,我的ItemsControl包含许多对TemplatedParent的引用,这些引用现在无效,因为它现在是TabControl的模板。
答案 1 :(得分:0)
问题1并不难解决 - TabControl在内部使用TabPanel,因此你可以像这样挂钩:
<GroupStyle.Panel>
<ItemsPanelTemplate>
<TabPanel />
</ItemsPanelTemplate>
</GroupStyle.Panel>
这会让你获得标签,这是进步,我希望:)
问题2并且显示标签内容本身会更具挑战性。使用ItemContainerGenerator尝试转换器或shenannigans可能是值得的。如果我发现任何聪明的话,我会更新我的帖子。