2011-10-12 49 views
4

我想將我的Button ControlTemplate中的Border.Background綁定到我的按鈕的背景屬性。通常我會用一個TemplateBinding:WPF將ControlTemplate的內容綁定到Property in Control?

<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並結合邊界底色物業直接{TemplateBinding背景} ....

回答

7

正如@雪狼表示,您應該將ColorColor綁定,而不是ColorBrush。但在他的解決方案中,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> 

,它應該工作。

+0

謝謝,你能編輯'他/她'是'他'嗎? – Snowbear

+0

:)當然**男** ** –

+0

我有一個使用模板內的模板的控件,我必須在它們兩者中進行這種綁定。像魔術一樣工作! – sprite

1

我想你可能在這裏有一些其他錯誤,但它不是報道好。GradientStop接受一個Color其相應的財產而ButtonBackgroundForeground屬性是刷,不是顏色。如果你認爲BackgroundForegroundSolidColorBrush你可以嘗試訪問您的綁定自己Color屬性,但我不知道它是否會工作或沒有:

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