C# DataTemplate不会与TabControl一起显示

C# DataTemplate不会与TabControl一起显示,c#,wpf,data-binding,datatemplate,tabcontrol,C#,Wpf,Data Binding,Datatemplate,Tabcontrol,我正在使用数据绑定来显示ItemsSource中的所有控件 <TabControl Grid.Row="1" TabStripPlacement="Left" ItemsSource="{Binding Source={StaticResource WorkflowSelector}, Path=Workflows}" SelectedIndex="0"> <TabControl.ItemTemplate> <

我正在使用数据绑定来显示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(公共属性) 但什么也没有显示

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

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


另外。。。如果我将ItemTemplate更改为ContentTemplate,则绑定工作正常(但内容不在标题中)

要更改
TabControl
HeaderTemplate
,应设置
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>


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

您想更改
TabITem
标题
TabITem
本身吗?我想更改标题我不确定您的代码为什么不起作用,我认为应该这样做,并且显示了我认为起作用的非常相似的代码。最好的猜测是您应用了某种自定义样式,或者可能是一个干扰的隐式数据模板。你能将你的相关部分复制/粘贴到一个新项目中进行测试吗?@Markus可以随意提问。如果您觉得我的回复对您有帮助,那么您可以将我的回复标记为答案,以简化将来对其他人的搜索。请阅读本文,我将TabControl的Itemssource绑定到一个可观察的集合。我不确定您的方法如何帮助我根据列表中的项目获得选项卡的动态大小(您的解决方案添加了1个TabItem…@Markus我更新了答案,可以看出此
TabControl
具有动态大小。您可以添加任意数量的内容。