将WPF的ControlTemplate的内容绑定到控件中的属性上?

4

我希望在我的按钮控件模板中,将Border.Background与按钮的背景属性绑定。通常情况下,我会使用TemplateBinding:

  <Style TargetType="Button" x:Key="ColuredButton">
                <Setter Property="Background" Value="LightGreen"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Border x:Name="Border" CornerRadius="2" BorderThickness="1" BorderBrush="Gray">
                               <Border.Background>
                                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                        <GradientStop Color="{TemplateBinding Foreground}"/>
                                        <GradientStop Color="{TemplateBinding Background}"/>
                                    </LinearGradientBrush>
                                </Border.Background>
                                    <ContentPresenter Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True" />
                            </Border> 
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

但是我收到了错误提示:“如果不在模板中,无法设置TemplateBinding”.. 但是我确实在一个模板中!(如果我不使用LinearGradientBrush并将边框的Background属性直接绑定到{TemplateBinding Background},它可以工作...
2个回答

8
如@Snowbear所说,你应该将Color绑定到Color,而不是将ColorBrush绑定。但在他的解决方案中,使用深层属性Path(例如Foreground.Color)的TemplateBinding不能作为绑定标记的一部分。
因此,请使用以下代码...
    <Border.Background>
      <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
         <GradientStop Color="{Binding Foreground.Color,
                               RelativeSource={RelativeSource TemplatedParent}}"
                       Offset="0.2"/>
         <GradientStop Color="{Binding Background.Color,
                               RelativeSource={RelativeSource TemplatedParent}}"
                       Offset="0.6"/>
      </LinearGradientBrush>
   </Border.Background>

它应该可以工作。


我有一个使用模板嵌套模板的控件,我不得不在它们两个中都进行绑定。效果神奇! - sprite

1

我认为你在这里可能有一些其他的错误,但它没有被报告得很好。 GradientStop 在其对应的属性中接受一个 Color,而 ButtonBackgroundForeground 属性是画刷,而不是颜色。 如果您认为 BackgroundForeground 将是 SolidColorBrush,您可以尝试访问它们的绑定中的 Color 属性,但我不确定它是否有效:

<GradientStop Color="{TemplateBinding Foreground.Color}"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接