ItemsControl группы во вкладках - PullRequest
1 голос
/ 29 февраля 2012

Мне нужно отобразить основные группы элементов управления в виде вкладок.

Существует свойство 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 не является панелью
  2. TabItem внутри GroupItem.Template упакован внутри GroupItem, но tabcontrol защищает только TabItems.

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Частичное решение, которое я нашел до сих пор, состоит в том, чтобы использовать TabControl с ItemsSource, привязанным к CollectionView.Groups, и внутри TabControl.ContentTemplate использовать ItemsControl, привязанный к текущей группе Items:

<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.

0 голосов
/ 29 февраля 2012

Проблема 1 не слишком сложна для решения - TabControl использует TabPanel внутри, так что вы можете подключить ее так:

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

Это даст вам заголовки вкладок, что, я надеюсь, будет прогрессом:)

Проблема 2 и отображение самого содержимого вкладки немного сложнее.Возможно, стоит попробовать конвертер или shenannigans с ItemContainerGenerator.Я обновлю свой пост, если со мной случится что-нибудь умное.

...