WPF 绑定到父项的 SelectedItem 的属性,来自



我有以下风格:

<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颜色绑定到TabControlSelectedItem 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,而是因为它在StyleControlTemplate中。因此,您的BasedOn Style不起作用,因为它不在ControlTemplate中。如果您在BasedOn Style中再次定义了ControlTemplate,那么它就会起作用,但显然您不想这样做。

满足要求的更好方法是将TabControl.SelectedIndex属性Bind到视图模型中的int属性,然后Binding到同一int属性,并对Rectangle.Fill属性使用简单IntegerToColorConverter

相关内容

  • 没有找到相关文章

最新更新