我只想了解以下情况。我在哪里实现 <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>
该模板填充了选项卡标题。
两个
当我拥有两者时,
ItemTemplate
在 DataTemplate
时填充选项卡标题填满标签内容。为什么所有这些差异。 ItemTemplate
& DataTemplate
如果另一个不存在,则填充选项卡标题。如果两者都存在,ItemTemplate
在 DataTemplate
时填满标题填充内容。虽然我有工作,但我很困惑。不应该像
<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/