WPF绑定到父SelectedItems属性从基于

时间:2013-11-17 17:47:33

标签: wpf xaml binding styles

我有以下风格:

<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="&#xE109;"  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> 风格,而是用于原始风格?

1 个答案:

答案 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 BindingRectangle上使用的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,而是因为它在ControlTemplateStyle。因此,BasedOn Style无效,因为它不在ControlTemplate中。如果您已在ControlTemplate BasedOn中再次定义了Style,那么它就会有效,但显然您不会这样做。

更好地满足您的要求是Bind TabControl.SelectedIndex属性到视图模型中的int属性,然后Binding到同一int属性IntegerToColorConverter } {property}并为Rectangle.Fill属性使用简单的{{1}}。