2009-08-29 11 views
15

que estoy tratando de hacer algo como esto ...¿Puede mi WPF Style Setter usar un TemplateBinding?

<Style 
    x:Key="MyBorderStyle" 
    TargetType="Border"> 
    <Setter 
     Property="BorderBrush" 
     Value="{StaticResource MyBorderBrush}" /> 
    <Setter 
     Property="Background" 
     Value="{StaticResource MyBackgroundBrush}" /> 
    <Setter 
     Property="Padding" 
     Value="{TemplateBinding Padding}" /> 
</Style> 

... pero me sale el error: 'Padding' member is not valid because it does not have a qualifying type name.

¿Cómo proporciono un "nombre de tipo de clasificación"?

Nota: El motivo por el que trato de hacer esto es porque me gustaría incluir el mismo Borde en una serie de Plantillas de Control similares.

Gracias.

EDIT:

Bueno he intentado esto ...

<Setter 
    Property="Padding" 
    Value="{TemplateBinding GridViewColumnHeader.Padding}" /> 

... y que en realidad compilado, pero luego, cuando me encontré con la aplicación, tengo una XamlParseException:

Cannot convert the value in attribute 'Value' to object of type ''.

Pensé que tal vez calificando Padding con GridViewColumnHeader (que es el ControlTemplate con el que quiero usar este estilo) funcionaría, pero no dados.

EDIT 2:

Bueno, de acuerdo a la documentación de TemplateBinding, que dice:

Links the value of a property in a control template to be the value of some other exposed property on the templated control.

así que suena como lo que estoy tratando de hacer es simplemente imposible. Realmente me gustaría poder crear estilos reutilizables para ciertos controles en mis plantillas de control, pero supongo que los enlaces de plantilla no se pueden incluir en estos estilos.

Respuesta

31

Esto debería funcionar para el caso en el que está creando plantillas de un control y desea vincular el valor de una propiedad de ese control a una propiedad de un control diferente dentro de la plantilla. En su caso, está creando plantillas (llámese MyControl), y esa plantilla incluirá un borde cuyo relleno debe estar vinculado al relleno de MyControl.

De MSDN documentation:

A TemplateBinding is an optimized form of a Binding for template scenarios, analogous to a Binding constructed with {Binding RelativeSource={RelativeSource TemplatedParent}}.

Por alguna razón, especificando TemplatedParent como la fuente para la unión no parece que trabajar dentro del estilo Setter. Para evitarlo, puede especificar que el padre relativo sea un AncestorType del control que está creando plantillas (que efectivamente encuentra el TemplatedParent siempre que no haya incrustado otros MyControls en la plantilla MyControl).

Utilicé esta solución cuando estaba tratando de crear una plantilla personalizada con un control de botón en el que el contenido (cadena) del botón debía vincularse a la propiedad Text de un bloque de texto en ControlTemplate para el botón.Aquí está cómo se veía ese código:

<StackPanel> 
    <StackPanel.Resources> 
     <ControlTemplate x:Key="BarButton" TargetType="{x:Type Button}"> 
      <ControlTemplate.Resources> 
       <Style TargetType="TextBlock" x:Key="ButtonLabel"> 
        <Setter Property="Text" Value="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type Button}} }" /> 
       </Style> 
      </ControlTemplate.Resources> 
      <Grid> 
       <!-- Other controls here --> 
       <TextBlock Name="LabelText" Style="{StaticResource ButtonLabel}" /> 
      </Grid> 
     </ControlTemplate> 
    </StackPanel.Resources> 
    <Button Width="100" Content="Label Text Here" Template="{StaticResource BarButton}" /> 
</StackPanel> 
+0

Una gran idea, Shane. Gracias. – devuxer

3

Una propiedad se puede calificar simplemente añadiéndole el nombre del tipo. Por ejemplo, Border.Padding en lugar de Padding.

Sin embargo, no estoy seguro de que tenga sentido para su situación. TemplateBinding s se usan dentro de una plantilla de control.

+1

Gracias, @Kent. Tu respuesta me dio una idea para probar (mira mi edición anterior), pero no funcionó. Tiene sentido que 'TemplateBinding's solo se pueda usar dentro de ControlTemplate ... si solo pudiera convencer al analizador de que tengo la intención de usar este estilo solo dentro de ControlTemplate ... – devuxer

Cuestiones relacionadas