2012-02-29 29 views
1

我需要将itemscontrol的主要组显示为选项卡。标签中的ItemsControl组

有一个ItemsControl.GroupStyle属性包含具有GroupStyle.Panel属性的GroupStyle。

从本质上讲,我想实现这一点:

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

回答

0

问题1是不是太难解决 - TabControl的使用的TabPanel内部,这样你就可以把它挂像这样:

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

这将让你带标题标签,这是一种进步,我希望:)

问题2并获取标签内容本身显示是一个更具挑战性。这可能是值得尝试一个转换器,或与ItemContainerGenerator shenannigans。我会更新我的帖子,如果有什么聪明的事情发生在我身上。

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的模板。