我有以下风格:
<SolidColorBrush x:Key="TabPanelBorderBrush" Color="#007ACC"/>
<Style TargetType="{x:Type local:MetroTabControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MetroTabControl}">
<Grid>
<Grid KeyboardNavigation.TabNavigation="Local" SnapsToDevicePixels="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid>
<ScrollViewer x:Name="ScrollViewer" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Hidden" Style="{DynamicResource TabPanelScrollViewer}">
<TabPanel x:Name="HeaderPanel" IsItemsHost="True" Panel.ZIndex="1" KeyboardNavigation.TabIndex="1"/>
</ScrollViewer>
<Button x:Name="AddTabItem" Content="" Style="{DynamicResource TabControlButton}" HorizontalAlignment="Right" VerticalAlignment="Top"/>
</Grid>
<Border Grid.Row="1" x:Name="TabPanelBorder" Background="Transparent">
<Rectangle x:Name="TabPanelBorderRectangle" Fill="{DynamicResource TabPanelBorderBrush}" Height="2"/>
</Border>
<Border Grid.Row="2" Background="{StaticResource TabControlBackground}"/>
<ContentPresenter Grid.Row="2" Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我想将 TabPanelBorderRectangle 的Fill
颜色绑定到TabControl
的SelectedItem
Foreground
。
所以我写了以下内容:
<Rectangle x:Name="TabPanelBorderRectangle" Fill="{Binding SelectedItem.Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}}" Height="2"/>
它有效。
现在,我有另一种风格,BasedOn
上面。
在BasedOn
风格中,我想把这条线放在上面,但当我这样做时,它不起作用。
这是我的基于风格:
<Style x:Key="CustomizedMetroTabControl" TargetType="{x:Type local:MetroTabControl}" BasedOn="{StaticResource {x:Type local:MetroTabControl}}">
<Style.Resources>
<SolidColorBrush x:Key="TabPanelBorderBrush" Color="{Binding SelectedItem.Foreground, RelativeSource={RelativeSource AncestorType={x:Type TabControl}}}"/>
</Style.Resources>
</Style>
当我将Color
更改为其他任何内容(绿色,蓝色等)时,它可以工作。
我的绑定有什么问题?为什么它在BasedOn
风格中不起作用,但在原始样式中却有效?
您说Visual Studio的"输出"窗口中没有错误,因为当我将代码添加到新项目并运行它时,出现以下错误:
System.Windows.Data 错误:4:找不到引用"RelativeSource FindAncestor, AncestorType='System.Windows.Controls.TabControl', AncestorLevel='1'"进行绑定的源。BindingExpression:Path=SelectedItem.Foreground;数据项=空;目标元素是 'SolidColorBrush' (HashCode=16700594);目标属性为"颜色"(类型"颜色")
当然,我把你的local:MetroTabControl
换成了普通的旧TabControl
,但错误是一样的。您收到此错误是因为您有一个TabControl
正在寻找另一个TabControl
上的属性,该属性是该属性的祖先。
如果您尝试使用在ControlTemplate
Rectangle
上使用的TemplatedParent RelativeSource Binding
,则会出现以下错误:
System.Windows.Data 错误:2:找不到目标元素的管理框架元素或框架内容元素。BindingExpression:Path=SelectedItem.Foreground;数据项=空;目标元素是'SolidColorBrush' (HashCode=56437836);目标属性为"颜色"(类型"颜色")
此错误更有帮助,因为它基本上告诉您无法从该模板外部访问ControlTemplate
中的元素,或者更准确地说,正如 Rohit 在他的评论中提到的,您无法访问不在连接的可视化树中的元素。
所以,回答你的问题,你的TemplatedParent Binding
在主要Style
工作,不是因为它只是在主Style
,而是因为它在Style
的ControlTemplate
中。因此,您的BasedOn
Style
不起作用,因为它不在ControlTemplate
中。如果您在BasedOn
Style
中再次定义了ControlTemplate
,那么它就会起作用,但显然您不想这样做。
满足要求的更好方法是将TabControl.SelectedIndex
属性Bind
到视图模型中的int
属性,然后Binding
到同一int
属性,并对Rectangle.Fill
属性使用简单IntegerToColorConverter
。