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用于选项卡内容.
| 归档时间: |
|
| 查看次数: |
19159 次 |
| 最近记录: |