我有以下风格:
<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
的{{1}}的{{1}}。
所以我写了以下内容:
SelectedItem
并且有效。
现在,我有另一种风格,Foreground
以上
在<Rectangle x:Name="TabPanelBorderRectangle" Fill="{Binding SelectedItem.Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}}" Height="2"/>
样式中,我想把这一行放在上面,但是当我这样做时它不起作用。
这是我的BasedOn风格:
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>
风格,而是用于原始风格?
答案 0 :(得分:1)
如果你说在Visual Studio的输出窗口中没有错误,这很有趣,因为当我将你的代码添加到新项目并运行它时,我收到以下错误:
System.Windows.Data错误:4:无法找到绑定源,引用'RelativeSource FindAncestor,AncestorType ='System.Windows.Controls.TabControl',AncestorLevel ='1''。 BindingExpression:路径= SelectedItem.Foreground;的DataItem = NULL; target元素是'SolidColorBrush'(HashCode = 16700594); target属性为'Color'(类型'Color')
当然,我将local:MetroTabControl
替换为普通的TabControl
,但错误也是一样的。您收到此错误的原因是您有一个TabControl
正在另一个TabControl
寻找属性,而这个属性是此的祖先。
如果您尝试使用TemplatedParent RelativeSource Binding
中Rectangle
上使用的ControlTemplate
,则会出现以下错误:
System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径= SelectedItem.Foreground;的DataItem = NULL; target元素是'SolidColorBrush'(HashCode = 56437836); target属性为'Color'(类型'Color')
此错误更有帮助,因为它基本上告诉您无法从该模板外部的ControlTemplate
访问元素,或者更准确地说,正如Rohit在其评论中提到的那样,您无法访问元素这不在连接的可视树中。
所以,为了回答你的问题,你的TemplatedParent Binding
在主Style
工作了,不是因为它只是在主Style
,而是因为它在ControlTemplate
在Style
。因此,BasedOn
Style
无效,因为它不在ControlTemplate
中。如果您已在ControlTemplate
BasedOn
中再次定义了Style
,那么它就会有效,但显然您不会这样做。
更好地满足您的要求是Bind
TabControl.SelectedIndex
属性到视图模型中的int
属性,然后Binding
到同一int
属性IntegerToColorConverter
} {property}并为Rectangle.Fill
属性使用简单的{{1}}。