2011-07-21 15 views
5

En el siguiente XAML estoy usando un rectángulo con un borde como la plantilla para un ToggleButton. Quiero que BorderBrush sea de un color diferente para reflejar el valor cambiante de ToggleButton.IsChecked. Desafortunadamente, mi intento aquí de usar un TemplateBinding en el DataTrigger no funciona. ¿Qué debo hacer en su lugar?TemplateBinding de un Style DataTrigger en 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> 

EDITAR

Cuando construyo y volver a cargar el diseñador me sale el siguiente error:

de error 1 Propiedad 'Encuadernación' no es compatible con valores de tipo 'TemplateBindingExpression'.

SOLUCIÓN

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

Respuesta

5

Se puede usar un disparador en el ControlTemplate, por ejemplo,

<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

Gracias por esto. He intentado hacer TemplateBindings en los desencadenadores ControlTemplate, pero no me di cuenta de que podía acceder a DependencyProperties del control desde la llamada a controltemplate –

0

Un problema que veo de inmediato es que se está configurando BorderBrush como un valor de la propiedad local en la frontera. Esto siempre anulará el valor aplicado por el estilo. Intente eliminar el atributo BorderBrush explícito y vea si eso funciona.

Border BorderBrush = "Gainsboro" BorderThickness = "1"

Dependency Property Value Inheritance

+0

, lo eliminé de mi código y actualicé el ejemplo en mi pregunta, pero Aún recibo el error que agregué arriba como una edición. – Grokodile

Cuestiones relacionadas