wpf - 在 tabControl 中为 TabItems 使用数据模板

标签 wpf datatemplate tabcontrol tabitem

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

现在说我的窗口有一个 GuiObjects 列表,我在 .xaml 文件中使用它来数据绑定(bind)到:

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

我可以为我想要生成的每种类型的 FrameworkElement 创建一个数据模板,但我在使用 TabControl 时遇到了问题。我可以像这样为 tabControl 创建一个数据模板:

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

结果是一个选项卡控件,其中包含每个正确的页面,但没有各个 TabItem 的内容。很公平,我将为 TabItems 创建一个 DataTemplate。对于每个 TabItem,我想将 GuiObjects 的内容放入堆栈面板中。

<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 的内容中绑定(bind)“GuiObjects”,我绑定(bind)的是 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,并以某种方式告诉它在绑定(bind) GuiObjects 时下降一级。有人知道怎么做吗?

最佳答案

TabControl 的页面内容提供模板,使用以下属性:

ItemTemplate/ItemTemplateSelector TabControl 的属性用于定义选项卡标题的外观。

关于wpf - 在 tabControl 中为 TabItems 使用数据模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20939660/

相关文章:

c# - wpf,如何限制TextBox的MaxLength?

wpf - 从数据模板内部绑定(bind)到 View 模型

vb.net - TabPage选择,重新选择TabPage时将Focus移至上一个ActiveControl

c# - 使用 MVVM 将命令绑定(bind)到 DataTemplate 中的控件

WPF 启动按钮位于工具栏选项卡旁边但不在内部

c# - 在选项卡控件中的选项卡页之间淡入淡出

wpf - XAML 工具提示的 StringFormat DateTime 不附加字符串

wpf - 是否有用于 "Microsoft"外观的标准 WPF 样式表?

WPF 默认主题和自定义样式不能一起工作

wpf - 具有GridViewColumn和DataTemplate的WPF ListView