2010-06-16 10 views
8

dodałem ValidateValueCallback do DependencyProperty nazywane A. Teraz w zwrotnego walidacji, A zostaje w porównaniu do wartości DependencyProperty nazywane B. Ale jak uzyskać dostęp do wartości B w statycznej metody ValidateValueCallback validateValue (wartość obiektu)? Dzięki za podpowiedź!DependencyProperty ValidateValueCallback pytanie

Przykładowy kod:

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 ? */ 
    } 
} 

Odpowiedz

14

callbacks walidacji są stosowane jako testy sprawdzające dla danej wartości wejściowej przed zestawem ograniczeń statycznych. W twoim sprawdzaniu poprawności sprawdzanie wartości dodatniej jest poprawnym użyciem sprawdzania poprawności, ale sprawdzanie względem innej właściwości nie jest poprawne. Jeśli trzeba zapewnić dana wartość jest mniejsza niż nieruchomości zależnej, należy użyć property coercion, tak:

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

Choć nie będzie to wyjątek, jeśli zbiór A> B (jak ValidationCallback robi) , to właściwie pożądane zachowanie. Ponieważ nie znasz kolejności, w której właściwości są ustawione, powinieneś więc wspierać właściwości ustawiane w dowolnej kolejności.

Musimy również powiedzieć WPF do zmuszania wartości nieruchomości A jeżeli wartość zmian B, jako przymusowej wartość może się zmienić:

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

Dziękuję bardzo za szczegółową odpowiedź! Oznaczone jako odpowiedź. Najpierw musiałem się do tego przyzwyczaić (nie wyrzucać wyjątku), ale cóż, wydaje się, że jest to "oficjalny" sposób. –