2010-06-16 1 views
8

나는 A라는 DependencyProperty에 ValidateValueCallback을 추가했습니다. 이제 validate 콜백에서 A는 B라는 DependencyProperty의 값과 비교됩니다. 정적 인 ValidateValueCallback 메서드의 B 값에 액세스하는 방법 validateValue (객체 값)? 어떤 힌트 주셔서 감사합니다!DependencyProperty ValidateValueCallback 질문

샘플 코드 :

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

답변

14

검증 콜백 정적 제약들의 세트에 대한 소정의 입력 값에 대한 새 너티 검사로 사용된다. 유효성 검사 콜백에서 양수 값을 확인하는 것은 유효성 검사를 올바르게 사용하는 것이지만 다른 특성을 검사하는 것은 유효하지 않습니다. 주어진 값이 종속 등록 정보보다 작 확인해야하는 경우에는 같은 property coercion을 사용해야합니다

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

당신이합니다 (ValidationCallback이하는 것처럼) A> B를 설정하면이 예외가 발생하지 않지만 , 이것은 실제로 원하는 동작입니다. 등록 정보가 설정된 순서를 모르기 때문에 임의의 순서로 설정된 등록 정보를 지원해야합니다.

우리는 또한 B 값이 변경은, 강제적으로 형태 변환 된 값으로 변경 될 경우 자산 A의 값을 강요하는 WPF 말할 필요 :

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

이 자세한 답변 주셔서 감사합니다! 답변으로 표시되었습니다. 나는 처음에는 이런 식으로 익숙해 져야했지만 (예외를 던지지는 않았지만), "공식적인"방법으로 보인다. –