2009-11-02 19 views
6

Tengo un conjunto de controles vinculados a los datos, en los que me gustaría agregar validadores programáticamente a los enlaces. Actualmente puedo iterar sobre el árbol visual para encontrar esos controles con enlaces, y también agregar mis validadores a estos controles. Pero para especificar qué controles deberían tener una validación específica, quería usar estilos. Así que mi XAML se ve así:Dado un WPF DependencyObject con estilo, ¿cómo puedo obtener la clave de estilo en el código?

<TextBox Name="someTextBox" Style="{StaticResource optionalNumericTextBox}" /> 

Aquí, el estilo optionalNumericTextBox sirve tanto la adición de una plantilla de error de validación y como decorador para indicar que el campo respectivo debe tener el validador numérico opcional aplicada.

El problema ocurre cuando estoy atravesando el árbol visual, descubro un control con enlaces, y luego necesito determinar el estilo en uso. Actualmente He intentado

dependencyObject.GetValue(FrameworkElement.StyleProperty) 

que me da a Style objeto, sino por lo que yo puedo decir, este objeto no tiene el valor 'optionalNumericTextBox'. ¿Es posible determinar la clave o se pierde esta información en el lector XAML?

Respuesta

5

Al usar StaticResourceExtension, esta información se pierde en tiempo de compilación al convertir su XAML en BAML. El uso de DynamicResourceExtension, por otro lado, mantiene la clave para que el recurso pueda resolverse en tiempo de ejecución. Para llegar a la clave, tendrá que utilizar ReadLocalValue():

//this gets the Style 
var s = textbox.GetValue(TextBox.StyleProperty); 
//this gets a ResourceReferenceExpression 
var l = textbox.ReadLocalValue(TextBox.StyleProperty); 

El problema es, ResourceReferenceExpression es un tipo interno, por lo que tendrá que utilizar la reflexión para sacar la llave.

Como alternativa a todo esto, ¿ha considerado el secuestro de la propiedad Tag en su lugar?

<Style x:Key="optionalNumericTextBox" TargetType="TextBox"> 
    <Setter Property="Tag" Value="optionalNumericTextBox"/> 
</Style> 

A continuación, el código puede simplemente comprobar la propiedad Tag en el TextBox.

+0

Gran consejo, utilizando un setter de propiedades. En realidad, me señaló en el sentido de usar una propiedad adjunta en lugar de la etiqueta. Así que ahora uso algo como: ¡Funciona como un encanto! –

Cuestiones relacionadas