2010-06-16 11 views
8

he añadido un ValidateValueCallback a un DependencyProperty llama A. Ahora en la devolución de llamada de validación, A se compara con el valor de una propiedad de dependencia llama B. Pero cómo acceder al valor de B en el método estático ValidateValueCallback validateValue (valor del objeto)? Gracias por cualquier pista!DependencyProperty ValidateValueCallback pregunta

Código de ejemplo:

class ValidateTest : DependencyObject 
{ 
    public static DependencyProperty AProperty = DependencyProperty.Register("A", typeof(double), typeof(ValidateTest), new PropertyMetadata(), validateValue); 
    public static DependencyProperty BProperty = DependencyProperty.Register("B", typeof(double), typeof(ValidateTest)); 


    static bool validateValue(object value) 
    { 
     // Given value shall be greater than 0 and smaller than B - but how to access the value of B? 

     return (double)value > 0 && value <= /* how to access the value of B ? */ 
    } 
} 

Respuesta

14

devoluciones de llamada de validación se utilizan como comprobaciones de validez para el valor de entrada dado contra un conjunto de restricciones estáticas. En su devolución de llamada de validación, la comprobación de un valor positivo es un uso correcto de la validación, pero no se compara con otra propiedad. Si es necesario asegurarse de un valor dado es menor que una propiedad dependiente, debe utilizar property coercion, así:

public static DependencyProperty AProperty = DependencyProperty.Register("A", typeof(double), typeof(ValidateTest), new PropertyMetadata(1.0, null, coerceValue), validateValue); 
public static DependencyProperty BProperty = DependencyProperty.Register("B", typeof(double), typeof(ValidateTest), new PropertyMetaData(bChanged)); 

static object coerceValue(DependencyObject d, object value) 
{ 
    var bVal = (double)d.GetValue(BProperty); 

    if ((double)value > bVal) 
     return bVal; 

    return value; 
} 

static bool validateValue(object value) 
{ 
    return (double)value > 0; 
} 

Mientras que esto no va a lanzar una excepción si se establece A> B (como el ValidationCallback hace) , este es en realidad el comportamiento deseado. Como no conoce el orden en que se configuran las propiedades, por lo tanto, debe admitir las propiedades configuradas en cualquier orden.

también tenemos que decirle WPF para coaccionar el valor de la propiedad A si cambia el valor de B, como el valor coaccionado podría cambiar:

static void bChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    d.CoerceValue(AProperty); 
} 
+0

muchas gracias por esta respuesta detallada! Marcado como respuesta. Primero tuve que acostumbrarme a esto (sin lanzar una excepción), pero bueno, parece ser la forma "oficial". –

Cuestiones relacionadas