首页 文章

在tabControl中为TabItem使用datatemplate

提问于
浏览
1

如果我有一个名为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>

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

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

1 回答

相关问题