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>

每个标签项的内容只是空的,而不是显示匹配的频道视图。

如果我删除整个 树它确实会在 tabitem 内容中显示匹配的对象字符串。

知道为什么它不显示数据模板吗?

谢谢。

【问题讨论】:

如果你删除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的主要内容,如果未能解决你的问题,请参考以下文章

WPF 自定义TabControl控件样式

wpf 如何在tabContrl页中显示一个xaml页

DockPanel 中的 WPF4 TabControl/Grid 隐藏了 StatusBar

WPF SelectedIndex 设置 TabControl 的问题

WPF TabControl 隐藏标头

是否可以在 WPF TabControl 中左对齐标题?