2010-06-16 16 views
8

Bir ValidateValueCallback eklendi validateValue (nesne değeri)? Herhangi bir ipucu için teşekkürler!DependencyProperty ValidateValueCallback soru

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

cevap

14

Doğrulama geri aramalar statik kısıtlamalar bir dizi karşı belirli bir giriş değeri için sağlıklı çalışma kontrolü olarak kullanılmaktadır. Doğrulama geri aramanızda, pozitif bir değer olup olmadığını kontrol etmek doğrulamanın doğru bir şekilde kullanılmasıdır, ancak başka bir mülke karşı kontrol edilmez. Belirli bir değer bağımlı özellik daha az olmasını sağlamak için gerekiyorsa, bunu gibi property coercion kullanmalıdır:

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

sen (ValidationCallback yaptığı gibi) A> B ayarlarsanız bu bir özel durum etmeyecek olsa Bu aslında istenen davranış. Özelliklerin ayarlandığı sırayı bilmediğinizden, herhangi bir sırada ayarlanan özellikleri desteklemelisiniz.

Biz de B değeri değiştiğinde, zorla değer olarak değişebilir Eğer mülkiyet A'nın değerini zorlamayı WPF söylemek gerekir:

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

bu detaylı cevap için çok teşekkür ederiz! Cevap olarak işaretlendi. İlk olarak bu şekilde alışmak zorunda kaldım (bir istisna atmadan), ama iyi, "resmi" yol gibi görünüyor. –