WPF Привязать содержимое ControlTemplate к свойству в контроле? - PullRequest
4 голосов
/ 12 октября 2011

Я хочу связать Border.Background в моем ControlTemplate кнопки со свойством 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 ]

8 голосов
/ 12 октября 2011

Как сказал @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 голос
/ 12 октября 2011

Я думаю, у вас может быть какая-то другая ошибка, но о ней не сообщается.GradientStop принимает Color в соответствующем свойстве, в то время как Background и Foreground свойства Button представляют собой кисти, а не цвета.Если вы думаете, что Background и Foreground будут SolidColorBrush, вы можете попытаться получить доступ к их свойству Color в привязке, но я не уверен, будет ли оно работать или нет:

<GradientStop Color="{TemplateBinding Foreground.Color}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...