ItemsControl在选项卡中分组

时间:2012-02-29 15:08:56

标签: wpf tabcontrol itemscontrol

我需要将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>

不幸的是,这有两个问题:

  1. TabControl不是Panel
  2. GroupItem.Template中的TabItem在GroupItem中打包,但tabcontrol只检测TabItems。

2 个答案:

答案 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可能是值得的。如果我发现任何聪明的话,我会更新我的帖子。