WPF:TabControl&;数据模板

WPF:TabControl&;数据模板,wpf,datatemplate,tabcontrol,Wpf,Datatemplate,Tabcontrol,我只想了解下面的场景。我正在实现绑定到可观察集合的 无数据模板 当我没有任何DataTemplates时,文本WpfApplication1.TabViewModel将显示在选项卡标题和内容中。好的,我理解这部分 只需ItemTemplate 当我刚刚 <TabControl.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> &l

我只想了解下面的场景。我正在实现绑定到可观察集合的

无数据模板

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

只需
ItemTemplate

当我刚刚

<TabControl.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding TabTitle}" />
        </StackPanel>
    </DataTemplate>
</TabControl.ItemTemplate>
模板将填充选项卡标题

两者都有

如果两者都有,
ItemTemplate
填充选项卡标题,而
DataTemplate
填充选项卡内容。为什么会有这么大的差异<代码>项目模板&
数据模板
如果另一个不存在,则填充选项卡标题。如果两者都存在,
ItemTemplate
填充标题,而
DataTemplate
填充内容


虽然我有些事情要做,但我还是很困惑。像
这样的东西不应该填充标题和
填充内容吗?

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

  • TabControl.ItemTemplate
    ,用于呈现
    TabItem
    标题
  • TabControl.ContentTemplate
    ,用于呈现
    TabItem
    内容
如果您没有显式地设置这些属性,那么WPF将尝试在其他地方解析它们。它将在逻辑树上查找一个资源,告诉它如何渲染视图模型。如果它找到一个
数据模板
,该模板具有匹配的
数据类型
,但没有键,它将使用它来渲染视图模型。如果找不到,它将默认呈现对象的
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正在尝试沿着您的逻辑树查找适当的
数据模板。找到它时,它将使用它渲染视图模型。如果找不到,则调用
ToString
,并呈现它

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

只需项目模板

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

只需数据模板

您尚未明确说明如何呈现选项卡标题或选项卡内容。因此,WPF将为这两种类型搜索适当的
数据模板。由于两者都包含视图模型的实例(即它们的
DataContext
),因此相同的
DataTemplate
将用于呈现选项卡标题及其内容

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

两者都有


在本例中,您已经明确说明了如何呈现选项卡标题,而不是选项卡内容。因此,显式的
DataTemplate
用于选项卡标题,隐式的
DataTemplate
用于选项卡内容。

如果我想要包含内容和选项卡控件项源的列表框,那么列表框将具有项列表。对此,我能做些什么?列表框本身也有数据模板“首先,这里涉及两个模板…”啊!您可能会认为在DataTemplate之外指定TabItem的方式与在TabControl ItemTemplate属性中的方式相同,因为ListView等人是这样工作的。谢谢
<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>