DataTemplate 不与 TabControl 一起显示

DataTemplate does not show up with TabControl

我正在使用 DataBinding 来显示 ItemsSource 中的所有控件

        <TabControl Grid.Row="1" TabStripPlacement="Left" ItemsSource="{Binding Source={StaticResource WorkflowSelector}, Path=Workflows}" SelectedIndex="0">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding PluginName}"></Label>
            </DataTemplate>
        </TabControl.ItemTemplate>
    </TabControl>

WorkflowSelector 是我的 ViewModel,它包含应在 TabControl 中显示的所有控件的列表。

我创建了一个 itemTemplate 以在选项卡中显示 PluginName (public 属性) 但什么也没有显示。

如果我检查可视化树,我可以看到 Tabcontrol 的数据绑定,其中包含 1 个具有 属性 PluginName 的项目。 Label 的 BindingExpression 的评估值为空

我注意到的第一件事是 ContentPresenter 没有 DataContext,而 Border 确实有正确的 DataContext

此外...如果我将 ItemTemplate 更改为 ContentTemplate,则绑定工作正常(但内容不在 header)

要更改 TabControlHeaderTemplate,您应该设置 TabItem 的样式并更改 HeaderTemplate:

<TabControl>
        <TabControl.Resources>
            <Style TargetType="{x:Type TabPanel}">
                <Setter Property="Background" Value="Yellow"/>
            </Style>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="BorderThickness" Value="0"/>
                <Setter Property="Padding" Value="0" />
                <Setter Property="HeaderTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Border x:Name="grid" Background="Red">
                                <ContentPresenter>
                                    <ContentPresenter.Content>
                                        <Border BorderThickness="3" BorderBrush="Red" CornerRadius="5">
                                        <StackPanel>                                                
                                            <TextBlock Margin="4" FontSize="15" Text="{TemplateBinding Content}"/>
                                            <TextBlock>I am a header</TextBlock>
                                        </StackPanel>
                                        </Border>
                                    </ContentPresenter.Content>                                        
                                </ContentPresenter>
                            </Border>
                            <DataTemplate.Triggers>
                                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TabItem}},Path=IsSelected}" Value="True">
                                    <Setter TargetName="grid" Property="Background" Value="Green"/>
                                </DataTrigger>
                            </DataTemplate.Triggers>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </TabControl.Resources>            
        <TabItem Header="Hey1" Name="tabItem1">
        </TabItem>
        <TabItem Header="Hey2" Name="tabItem2">
        </TabItem>
        <TabItem Header="Hey3" Name="tabItem3">
        </TabItem>
        <TabItem Header="Hey4" Name="tabItem4">
        </TabItem>
    </TabControl>

因为我在可视化树中看到 DataContext 在层次结构中设置得更高,所以我将数据绑定更改为:

 <Label Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabItem}}, Path=DataContext.PluginName}"></Label>

这并不能解释根本原因,但这是一个我可以接受的简短解决方法