resource - ¿Puede mi WPF Style Setter usar TemplateBinding?
wpf style resource (2)
Esto debería funcionar para el caso en el que esté creando una plantilla de control y desee 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 una plantilla de algo (llámelo MyControl), y esa plantilla incluirá un borde cuyo relleno debe estar vinculado al relleno de MyControl.
De la documentación de MSDN :
Un TemplateBinding es una forma optimizada de un Binding para escenarios de plantillas, análogo a un Binding construido con {Binding RelativeSource = {RelativeSource TemplatedParent}}.
Por cualquier motivo, la especificación de TemplatedParent como la fuente para el enlace no parece funcionar dentro de los Definidores de estilos. Para evitarlo, puede especificar que el padre relativo sea un AncestorType del control al que está haciendo plantillas (que encuentra efectivamente a TemplatedParent siempre que no haya incrustado otros MyControls en la plantilla MyControl).
Utilicé esta solución cuando intentaba personalizar la plantilla de un control de botón en el que el contenido (de cadena) del botón debía vincularse a la propiedad de texto de un bloque de texto en la plantilla de control para el botón. Esto es lo que parecí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>
Estoy tratando de hacer algo como esto ...
<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 recibo el error: ''Padding'' member is not valid because it does not have a qualifying type name.
¿Cómo proporciono un "nombre de tipo calificado"?
Nota: la razón por la que estoy tratando de hacer esto es que me gustaría incluir el mismo borde en una serie de Plantillas de control similares.
Gracias.
EDITAR:
Bueno, he intentado esto ...
<Setter
Property="Padding"
Value="{TemplateBinding GridViewColumnHeader.Padding}" />
... y en realidad se compiló, pero luego cuando ejecuté la aplicación, obtuve una XamlParseException
:
Cannot convert the value in attribute ''Value'' to object of type ''''.
Pensé que tal vez calificar el Padding
con GridViewColumnHeader
(que es la plantilla de GridViewColumnHeader
con la que quiero usar este estilo) funcionaría, pero no los dados.
EDIT 2:
Bueno, según la documentación de TemplateBinding
, dice:
Vincula el valor de una propiedad en una plantilla de control para que sea el valor de alguna otra propiedad expuesta en el control de plantilla.
Así que parece que 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 plantillas no se pueden incluir en estos estilos.
Una propiedad puede ser calificada simplemente prefijándola con el nombre de tipo. Por ejemplo, Border.Padding
lugar de Padding
.
Sin embargo, no estoy seguro de que tenga sentido para su escenario. TemplateBinding
s se utilizan dentro de una plantilla de control.