WPF:TabControl和DataTemplates

Jie*_*eng 32 wpf tabcontrol datatemplate

我只是想了解以下场景.我在哪里实施一个<TabControl>绑定ObservableCollection<TabViewModel>

没有数据模板

当我没有任何DataTemplates时,文本WpfApplication1.TabViewModel显示在选项卡标题和内容中.好的,我理解这一部分.

只是 ItemTemplate

当我有

<TabControl.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding TabTitle}" />
        </StackPanel>
    </DataTemplate>
</TabControl.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

然后填充了我的标题页眉.标签内容仍然是WpfApplication1.TabViewModel.

只是 DataTemplate

当我在我的下面有我的 <Window.Resources>

<DataTemplate DataType="{x:Type local:TabViewModel}">
    <TextBox Text="{Binding Text}" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

该模板填充了标题页眉.

如果我ItemTemplate同时DataTemplate填写选项卡内容,则填充选项卡标题.为何所有这些差异.ItemTemplate&DataTemplate填满的标签标头如果对方是不存在.如果两者都存在,ItemTemplate则在DataTemplate填充内容时填充标题.

虽然我有事情可行,但我很困惑.不<TabControl.HeaderTemplate>应该是填充标题和<TabControl.ItemTemplate>填写内容的东西吗?

Ken*_*art 54

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

  • TabControl.ItemTemplate,用于呈现TabItem标题
  • TabControl.ContentTemplate,用于呈现TabItem内容

如果您未明确设置这些属性,则WPF将尝试在其他位置解析它们.它将向上走逻辑树,寻找资源,告诉它如何渲染视图模型.如果它找到DataTemplate具有匹配DataType但没有键的键,则它将使用它来呈现视图模型.如果找不到,则默认为渲染ToString对象的值.

所以,如果你想要明确,你想要这样的东西:

<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>
Run Code Online (Sandbox Code Playgroud)

由于您不是特定的,WPF正在尝试使用您的逻辑树来查找合适的树DataTemplate.当它找到它时,它使用它来渲染视图模型.它找不到它,它会调用ToString并呈现它.

所以要解决你的具体情况:

只是ItemTemplate

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

只是DataTemplate

您尚未明确说明如何呈现标签页眉或标签内容.因此,WPF会搜索适合DataTemplate两者的内容.由于两者都包含视图模型的实例(即它们的实例DataContext),因此DataTemplate将使用相同的实例来呈现选项卡标题及其内容.

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

在这种情况下,您已明确说明了如何呈现选项卡标题而不是标签内容.因此,explicit DataTemplate用于选项卡标题,而implicit DataTemplate用于选项卡内容.