WPF:TabControl&的DataTemplates

时间:2010-10-30 09:10:00

标签: wpf datatemplate tabcontrol

我只想了解以下情况。我在哪里实施<TabControl>绑定到ObservableCollection<TabViewModel>

无数据模板

当我没有任何DataTemplate时,标题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>

该模板填满了标题页。

两个

当我同时使用两者时,ItemTemplate会填充标题页标题,而DataTemplate会填充标签内容。为何所有这些差异。 ItemTemplate&amp;如果另一个不存在,DataTemplate将填充标题页眉。如果两者都存在,ItemTemplate会在DataTemplate填充内容时填充标题。

虽然我有事情可行,但我很困惑。不应该像<TabControl.HeaderTemplate>那样填充标题并<TabControl.ItemTemplate>填写内容吗?

1 个答案:

答案 0 :(得分:52)

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

  • 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>

由于您并不具体,WPF会尝试使用您的逻辑树来查找合适的DataTemplate。当它找到它时,它使用它来渲染视图模型。如果找不到它,它会调用ToString并呈现它。

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

Just ItemTemplate

您已明确说明了如何呈现标签页但不显示标签内容。所以前者使用提供的DataTemplate呈现,但后者默认为ToString

只是DataTemplate

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

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

<强>两个

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