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)
要更改 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>
这并不能解释根本原因,但这是一个我可以接受的简短解决方法
我正在使用 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)
要更改 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>
这并不能解释根本原因,但这是一个我可以接受的简短解决方法