在tabControl中为TabItem使用datatemplate

时间:2014-01-05 21:52:34

标签: wpf datatemplate tabcontrol tabitem

如果我有一个名为GuiObject的类,那个类有一个名为GuiObjects的GuiObjects列表:“GuiObjects”。

现在说我的窗口有一个GuiObjects列表,我在.xaml文件中使用dataBind到:

<StackPanel>
    <ItemsControl ItemsSource="{Binding TopObjectList}" DataTemplateSelector="{DynamicResource templateSelector"/> 
</StackPanel>

我可以为我想要生成的每种类型的FrameworkElement创建一个datatemplate,但是我遇到了TabControl的问题。我可以为tabControl创建一个datatemplate,如下所示:

<DataTemplate x:key="TabControlTemplate" DataTemplateSelector="{DynamicResource templateSelector" >
    <TabControl ItemsSource="{Binding GuiObjects}" />
</DataTemplate>

结果是一个制表符控件,其中包含每个正确的页面,但没有单个TabItems的内容。很公平,我只会为TabItems制作一个DataTemplate。对于每个TabItem,我想将GuiObjects的内容放入stackpanel。

<DataTemplate x:key="TabItemTemplate" DataTemplateSelector="{Resource templateSelector">
    <TabItem Header = {Binding Title}>
        <StackPanel>
            <ItemsControl ItemsSource="{Binding GuiObjects}" DataTemplateSelector="{DynamicResource templateSelector"/> 
        </StackPanel>
    </TabItem>
</DataTemplate>

这里的问题是TabItemTemplate永远不会被调用。我尝试过在TabControlTemplate中设置ItemContainerStyle的解决方案,但后来我遇到了层次结构的问题。如果我在TabItem的内容中绑定“GuiObjects”,我将绑定tabItems列表,而不是每个TabItem中的列表。 (我想做第二个)。这是一个例子:

<DataTemplate x:key="TabControlTemplate" DataTemplateSelector="{DynamicResource templateSelector" >
    <TabControl ItemsSource="{Binding GuiObjects}">
        <TabControl.ItemContainerStyle>
            <Style TargetType="TabItem">
                <Setter Property="Header" Value="{Binding Title}"/>
                <Setter Property="Content" Value="<StackPanel><ItemsControl ItemsSource="{Binding GuiObjects}" DataTemplateSelector="{DynamicResource templateSelector"/></StackPanel>"/>
            </Style>
        </TabControl.ItemContainerStyle>
    </TabControl>
</DataTemplate>

同样,这个解决方案有级别问题:当我说:{Binding GuiObjets}时,我指的是TabItems列表,而不是每个TabItem中的FrameworkElements列表。

解决方案是要么为TabControl和TabItem添加单独的DataTemplates,只需修复它以便DataTemplateSelector实际上适用于TabItems(不知道如何执行此操作)。或者使用ItemContainerStyle,并以某种方式告诉它在绑定GuiObjects时向下一级。有谁知道怎么做?

1 个答案:

答案 0 :(得分:9)

要为TabControl的网页的内容提供模板,请使用以下属性:

TabControl的{​​{3}} / ItemTemplate属性用于定义标签标题的外观。