WPF:选项卡控件和数据模板

标签 wpf datatemplate tabcontrol

我只想了解以下情况。我在哪里实现 <TabControl>绑定(bind)到 ObservableCollection<TabViewModel>
没有数据模板

当我没有任何DataTemplate s, 正文 WpfApplication1.TabViewModel出现在选项卡标题和内容中。好的,我理解这部分。

只需 ItemTemplate

当我刚有

<TabControl.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding TabTitle}" />
        </StackPanel>
    </DataTemplate>
</TabControl.ItemTemplate>

然后我的标签页眉被填满。标签内容仍然是WpfApplication1.TabViewModel .

只需 DataTemplate

当我的 <Window.Resources> 中只有以下内容时
<DataTemplate DataType="{x:Type local:TabViewModel}">
    <TextBox Text="{Binding Text}" />
</DataTemplate>

该模板填充了选项卡标题。

两个

当我拥有两者时,ItemTemplateDataTemplate 时填充选项卡标题填满标签内容。为什么所有这些差异。 ItemTemplate & DataTemplate如果另一个不存在,则填充选项卡标题。如果两者都存在,ItemTemplateDataTemplate 时填满标题填充内容。

虽然我有工作,但我很困惑。不应该像 <TabControl.HeaderTemplate>填充标题和<TabControl.ItemTemplate>填写内容?

最佳答案

首先,这里涉及到两个模板:

  • TabControl.ItemTemplate ,用于渲染 TabItem标题
  • TabControl.ContentTemplate ,用于渲染 TabItem内容

  • 如果您没有明确设置这些属性,那么 WPF 将尝试在其他地方解析它们。它将沿着逻辑树查找资源,告诉它如何呈现您的 View 模型。如果找到 DataTemplate具有匹配的 DataType但没有键,它将使用它来渲染 View 模型。如果找不到,它将默认呈现 ToString对象的值(value)。

    所以,如果你想明确一点,你想要这样的东西:
    <TabControl ItemsSource="{Binding Tabs}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding TabTitle}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Text}"/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
    

    由于您没有具体说明,WPF 正试图沿着您的逻辑树查找合适的 DataTemplate。 .当它找到它时,它会使用它来渲染 View 模型。在找不到的地方,它会调用 ToString并呈现。

    因此,为了解决您的具体情况:

    只是项目模板

    您已经明确说明了如何呈现选项卡标题而不是选项卡内容。所以前者使用提供的 DataTemplate 渲染。 , 但后者默认为 ToString .

    只是数据模板

    您没有明确说明如何呈现选项卡标题或选项卡内容。因此,WPF 搜索合适的 DataTemplate对彼此而言。由于两者都包含您的 View 模型的实例(这是他们的 DataContext ),所以相同的 DataTemplate将用于呈现选项卡标题及其内容。

    注意:您没有明确说明这是您的问题中发生的情况。如我错了请纠正我。

    两个

    在这种情况下,您已经明确说明了如何呈现选项卡标题而不是选项卡内容。因此,显式 DataTemplate用于选项卡标题和隐式 DataTemplate用于标签内容。

    关于WPF:选项卡控件和数据模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4058003/

    相关文章:

    wpf - 命令绑定(bind)到 DataTemplate 内的按钮不起作用

    wpf - 如何在左侧和右侧拆分 WPF TabControl 的选项卡?

    c# - WPF Tabcontrol(TabItem 内容未出现)

    c# - 在 DataTemplate 内的 ListView 上添加 EventTrigger 导致 XamlParseException

    c# - 如何将事件触发器添加到业务对象的数据模板?

    c# - WPF数据绑定(bind)问题

    c# - 如何创建运行 STA 线程的任务 (TPL)?

    wpf - 为什么我的风格没有被应用?

    WPF tabitem 定位

    c# - 不显示动态 DataGrid 列的显示名称