wpf 项目选项卡中的控件组

uxh89sit  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(253)

我需要显示项目控制作为选项卡的主要群体。
有一个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中的TabItem。模板被打包在GroupItem中,但tabcontrol只包含TabItem。
9jyewag0

9jyewag01#

到目前为止我找到的一个部分解决方案是使用TabControl,其中ItemsSource绑定到CollectionView.Groups,并且在TabControl.ContentTemplate中使用ItemsControl绑定到当前组Items:

<TabControl ItemsSource="{Binding MyItems, Converter={StaticResource CollectionToViewGroupsConverter}}"
            SelectedIndex="0">
    <TabControl.ContentTemplate>
        <DataTemplate DataType="{x:Type CollectionViewGroup}">
            <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的模板。

2sbarzqh

2sbarzqh2#

问题1并不难解决- TabControl在内部使用TabPanel,因此您可以像这样连接它:

<GroupStyle.Panel>
    <ItemsPanelTemplate>
        <TabPanel />
    </ItemsPanelTemplate>
</GroupStyle.Panel>

这会让你得到headered标签,这是进步,我希望:)
问题2和让选项卡内容本身显示出来是一个更大的挑战。可能值得尝试使用转换器或带有ItemContainerGenerator的shenannigans。我会更新我的帖子,如果有什么聪明的想法。

相关问题