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

时间:2011-10-12 08:32:28

标签: wpf .net-3.5 wpf-controls

我想将Button ControlTemplate中的Border.Background绑定到我的按钮的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并将边框Backround属性直接绑定到{TemplateBinding Background},它就可以工作....

2 个答案:

答案 0 :(得分:8)

正如@Snowbear所说,你应该Color绑定到Color而不是Color绑定到Brush。但在他的解决方案中,TemplateBinding具有深Path之类的Foreground.Color不允许作为绑定标记的一部分。

所以请使用以下内容......

    <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>

它应该有用。

答案 1 :(得分:1)

我认为你可能会遇到其他一些错误,但报道不好。 GradientStop在其相应的属性中接受Color,而Background的{​​{1}}和Foreground属性是画笔,而不是颜色。如果您认为ButtonBackgroundForeground,您可能会尝试访问绑定中的SolidColorBrush属性,但我不确定它是否有效:

Color