绑定到templatedparent的属性以在wpf中设置样式设置器内部的值时出现问题

绑定到templatedparent的属性以在wpf中设置样式设置器内部的值时出现问题,wpf,xaml,binding,styles,relativesource,Wpf,Xaml,Binding,Styles,Relativesource,我的问题是: 我还没有弄清楚如何在针对特定控件的样式中的属性a的Setter的“Setter.Value”字段中绑定到该particualr控件的属性B。更具体地说,我想在按钮内容属性的可视树中的图形元素上使用前景笔刷值。这将确保图形元素始终具有为此按钮控件设置的前景色 我努力实现的目标: 我正在开发一个WPF应用程序,其中有三个按钮控件: 默认按钮 特殊按钮 扩展特殊按钮 DefaultButton是我通过带有ControlTemplate的样式定义应用程序中按钮样式的地方 SpecialBu

我的问题是:

我还没有弄清楚如何在针对特定控件的样式中的属性a的Setter的“Setter.Value”字段中绑定到该particualr控件的属性B。更具体地说,我想在按钮内容属性的可视树中的图形元素上使用前景笔刷值。这将确保图形元素始终具有为此按钮控件设置的前景色

我努力实现的目标:

我正在开发一个WPF应用程序,其中有三个按钮控件:

默认按钮 特殊按钮 扩展特殊按钮 DefaultButton是我通过带有ControlTemplate的样式定义应用程序中按钮样式的地方

SpecialButton引入了一个不应用于常规按钮的新属性。该属性将由我通过样式设置器定义的一个可视状态表示。否则,其外观应与DefaultButton相同

我根据DefaultButton的样式来定义这个特殊按钮的样式。在这种样式中,没有ControlTemplate,只有基于两个属性条件的MultiTrigger响应,设置了两个视觉属性:

<Style x:Key="SpecialButtonStyle" TargetType="{x:Type MyControls:SpecialButton}" BasedOn="{StaticResource DefaultButtonStyle}">
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsActive" Value="false"/>
                <Condition Property="IsMouseOver" Value="false"/>
            </MultiTrigger.Conditions>
            <Setter Property="BorderBrush" Value="{DynamicResource ButtonDisabledBorder}" />
            <Setter Property="Background" Value="{DynamicResource ButtonDisabledBg}" />
        </MultiTrigger>
    </Style.Triggers>
</Style>
所有这些都很有效

下一步也没问题: 我想将ExtendedSpecialButton建立在SpecialButton的基础上,并在按钮内设置默认形状内容

<Style x:Key="ExtendedSpecialButtonStyle" TargetType="{x:Type MyControls:ExtendedSpecialButton}" BasedOn="{StaticResource SpecialButtonStyle}">
    <Setter Property="Content">
        <Setter.Value>
            <Rectangle Fill="Black" Height="5" Width="15"></Rectangle>
        </Setter.Value>
    </Setter>
</Style>
DefaultButton的原始样式仍然存在-响应SpecialButton的IsActiveProperty的添加的视觉状态仍然存在-ExtendedSpecialButton还继承了SpecialButton的多触发器创建的视觉行为

我还成功地显示了这个ExtendedSpecialButton应该具有的图形元素

然而,我希望这个图形元素的填充使用前景色。这个前景色最初是在DefaultButton中设计的,对于前两个按钮来说效果很好

下面的代码是我目前认为应该如何进行这样的绑定。但这不起作用:

   <Style x:Key="ExtendedSpecialButtonStyle" TargetType="{x:Type MyControls:ExtendedSpecialButton}" BasedOn="{StaticResource SpecialButtonStyle}">
    <Setter Property="Content">
        <Setter.Value>
            <Rectangle Fill="{Binding RelativeSource={RelativeSource TemplatedParent}}" Height="6" Width="20"></Rectangle>
        </Setter.Value>
    </Setter>
</Style>

有人知道我可以做些什么来设置绑定,使其达到我想要的效果吗?

如果您有多个ExtendedSpecialButtonStyle,则该样式将出现问题。将内容设置器切换到ContentTemplate,并将矩形包装在标记中,以避免由于尝试将同一矩形对象添加到多个按钮而导致对象仅允许一个父对象出现错误。感谢您指出设置内容的问题。正如我在设置内容和使用时所做的实验一样:{binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type MyControls:ExtendedSpecialButton},Path=TheBrushPropertyIwastedIn}实现了绑定-尽管如您所述,该控件的多个实例失败。当使用DataTemplate设置ControlTemplate时,我似乎失去了绑定的能力。有什么建议吗?您是否知道您正在尝试将控件强制转换为绑定中的笔刷?你是说{Binding RelativeSource={RelativeSource TemplatedParent},Path=Foreground}吗?我的评论中描述的绑定是针对矩形的Fill=属性的。。因此,我试图将填充的笔刷绑定到模板化父对象的前景笔刷属性。。但不知何故,我没有使用FindAncestor的东西就没有得到那个绑定。