2011-07-21 73 views
5

在下面的XAML中,我使用带边框的矩形作为ToggleButton的模板。 我希望BorderBrush是一种不同的颜色来反映ToggleButton.IsChecked的变化值。 不幸的是我在DataTrigger中使用TemplateBinding的尝试不起作用。我需要做些什么呢?TemplateBinding从样式DataTrigger在ControlTemplate

<StackPanel Orientation="Horizontal"> 
    <StackPanel.Resources> 
     <ControlTemplate x:Key="ButtonAsSwatchTemplate"> 
      <Border BorderThickness="1"> 
       <Border.Style> 
        <Style> 
         <Setter Property="BorderBrush" Value="Gainsboro" /> 
         <Style.Triggers> 
          <!-- TemplateBinding doesn't work.--> 
          <DataTrigger        
           Binding={TemplateBinding Property=IsChecked}  
           Value="True"> 
           <Setter Property="BorderBrush" Value="Black" /> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </Border.Style> 
       <Rectangle Fill="{TemplateBinding Property=Background}" 
          Width="15" Height="15" /> 
      </Border> 
     </ControlTemplate> 
    </StackPanel.Resources> 
    <ToggleButton Template="{StaticResource ButtonAsSwatchTemplate}" 
        HorizontalAlignment="Center" VerticalAlignment="Center" 
        Margin="2" Background="Red" /> 
</StackPanel> 

编辑

当我建立和重新加载设计师,我得到以下错误:

错误房产“绑定”不支持类型“TemplateBindingExpression”的值。

SOLUTION

<StackPanel Orientation="Horizontal"> 
    <StackPanel.Resources> 
     <ControlTemplate x:Key="ButtonAsSwatchTemplate">  
      <Border x:Name="SwatchBorder" BorderThickness="1"> 
       <Rectangle Fill="{TemplateBinding Property=Background}" Width="15" Height="15" /> 
      </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="ToggleButton.IsChecked" Value="True"> 
       <Setter TargetName="SwatchBorder" Property="BorderBrush" Value="Yellow" /> 
      </Trigger> 
     </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </StackPanel.Resources> 
    <RadioButton Template="{StaticResource ButtonAsSwatchTemplate}" 
     GroupName="CropGuidesColourRadioButtonGroup" 
     IsChecked="{Binding Checked}" Margin="2" Background="Red" /> 
    <RadioButton Template="{StaticResource ButtonAsSwatchTemplate}" 
     GroupName="CropGuidesColourRadioButtonGroup" 
     IsChecked="{Binding Checked}" Margin="2" Background="Black" /> 
    ... 
</StackPanel> 

回答

5

你可以在控件模板,例如使用触发器

<StackPanel Orientation="Horizontal"> 
    <StackPanel.Resources> 
     <ControlTemplate x:Key="ButtonAsSwatchTemplate"> 
      <Border x:Name="myBorder" BorderBrush="Gainsboro" BorderThickness="1"> 
       <Rectangle Fill="{TemplateBinding Property=Background}" Width="15" Height="15" /> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="ToggleButton.IsChecked" Value="True"> 
        <Setter TargetName="myBorder" Property="BorderBrush" Value="Black" /> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </StackPanel.Resources> 
    <ToggleButton Template="{StaticResource ButtonAsSwatchTemplate}" 
       HorizontalAlignment="Center" VerticalAlignment="Center" 
       Margin="2" Background="Red" /> 
</StackPanel> 
+0

感谢。我一直在尝试在ControlTemplate触发器中执行TemplateBindings,但没有意识到我可以从控制模板 –

0

我马上看到的一个问题是,您将BorderBrush设置为Border上的本地属性值。这将始终覆盖样式应用的值。尝试删除显式的BorderBrush属性,看看是否有效。

边界 BorderBrush = “亮灰” 了borderThickness = “1”

Dependency Property Value Inheritance

+0

良好的调用访问控件的DependencyProperties,我从我的代码中删除了该代码,并更新了我的问题中的示例,但我仍然收到上面作为编辑添加的错误。 – Grokodile

相关问题