【问题标题】:DataTemplate does not show up with TabControlDataTemplate 不显示 TabControl
【发布时间】:2016-09-14 22:17:25
【问题描述】:

我正在使用 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(公共属性) 但什么都没有显示。

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

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

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

【问题讨论】:

  • 您想更改HeaderTabITem 还是TabItem 本身?
  • 我要更改标题
  • 我不知道为什么你的代码不起作用,我认为它应该和this answer 显示非常相似的代码,我认为它是有效的。最好的猜测是您应用了某种自定义样式,或者可能是干扰的隐式 DataTemplate。您可以将相关部分复制/粘贴到新项目中进行测试吗?

标签: c# wpf data-binding datatemplate tabcontrol


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    要更改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>
    

    【讨论】:

    • @Markus 随时提出任何问题。如果您觉得我的回复对您有帮助,那么您可以将我的回复标记为答案,以简化日后其他人的搜索。请阅读此meta.stackexchange.com/questions/5234/…
    • 我将 TabControl 的 Itemssource 绑定到 Observable 集合。我不确定您的方法如何帮助我根据列表中的项目获得标签的动态大小(您的解决方案添加了 1 个 TabItem...)
    • @Markus 我已经更新了答案,可以看出这个TabControl 具有动态大小。您可以根据需要添加任意数量。
    猜你喜欢
    • 2012-09-15
    • 2017-09-10
    • 2022-01-11
    • 2012-02-14
    • 2011-09-08
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多