TabControl 内的 WPF ContentControl 不显示 DataTemplates
Posted
技术标签:
【中文标题】TabControl 内的 WPF ContentControl 不显示 DataTemplates【英文标题】:WPF ContentControl inside of TabControl does not show DataTemplates 【发布时间】:2022-01-11 03:16:26 【问题描述】:我有一个 ListView,它有 TabControl,它显示 2 种类型的视图。
<ListView x:Name="Devices" ItemsSource="Binding Devices">
<ListView.Resources>
<DataTemplate DataType="x:Type app:DeviceViewModel">
<Expander Header="Binding Type">
<StackPanel Orientation="Vertical">
<ContentControl>
<ContentControl.Resources>
<DataTemplate DataType="x:Type app:DeviceAViewModel">
<local:DeviceAView/>
</DataTemplate>
<DataTemplate DataType="x:Type app:DeviceBViewModel">
<local:DeviceBView/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
<TabControl x:Name="Channel" ItemsSource="Binding Channels" DisplayMemberPath="Index">
<TabControl.ContentTemplate>
<DataTemplate>
<ContentControl>
<ContentControl.Resources> <------ this part does't work
<DataTemplate DataType="x:Type app:ChannelAViewModel">
<local:ChannelAView DataContext="Binding"/>
</DataTemplate>
<DataTemplate DataType="x:Type app:ChannelBViewModel">
<local:ChannelBView DataContext="Binding"/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</StackPanel>
</Expander>
</DataTemplate>
</ListView.Resources>
</ListView>
每个标签项的内容只是空的,而不是显示匹配的频道视图。
如果我删除整个
知道为什么它不显示数据模板吗?
谢谢。
【问题讨论】:
如果你删除DisplayMemberPath="Index"
会怎样?
我试过了,还是不显示内容。
【参考方案1】:
尝试像这样 Listview 项目模板。 像这样:
<ListView x:Name="Devices" ItemsSource="Binding Devices">
<ListView.ItemContainerStyle>
<Style TargetType="x:Type ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type ListViewItem">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical">
<ContentControl>
</ContentControl>
<TabControl x:Name="Channel" ItemsSource="Binding Channels">
</TabControl>
</StackPanel>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
</ListView>
或者这个:
<ListView x:Name="Devices" ItemsSource="Binding Devices">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical">
<ContentControl>
</ContentControl>
<TabControl x:Name="Channel" ItemsSource="Binding Channels">
</TabControl>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
【讨论】:
【参考方案2】:好的,我想通了。 我必须将 Content=Binding 添加到 ContentControl 或者我可以删除它,而不是使用 TabControl.ContentTemplate 我将 DataTemplates 放在 TabControl.Resources 中,它工作正常。
<TabControl x:Name="Channel" ItemsSource="Binding Channels" DisplayMemberPath="Index">
<TabControl.Resources>
<DataTemplate DataType="x:Type app:ChannelAViewModel">
<local:ChannelAView DataContext="Binding"/>
</DataTemplate>
<DataTemplate DataType="x:Type app:ChannelBViewModel">
<local:ChannelBView DataContext="Binding"/>
</DataTemplate>
</TabControl.Resources>
</TabControl>
【讨论】:
以上是关于TabControl 内的 WPF ContentControl 不显示 DataTemplates的主要内容,如果未能解决你的问题,请参考以下文章
DockPanel 中的 WPF4 TabControl/Grid 隐藏了 StatusBar