我只想了解以下情况。我在哪里实施<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>
填写内容吗?
答案 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
用于标签内容。