2009-03-13 17 views
6

IDataErrorInfo uygulayan Linq - Varlıklar sınıfındaki bir özelliğe bağlı bir WPF uygulamasında bir metin kutusu var. Metin kutusu bağlaması ValidatesOnExceptions = True ve ValidatesOnDataErrors = True değerine sahiptir. Metin kutusu bir tamsayı özelliğine bağlı olduğunda ve kullanıcı metin girdiğinde, metin kutusu anahattı özel bir stil ayarlamadığımda kırmızı olarak görüntülenir.WPF Ciltleme - Nesne belirleme geçersiz kılmak için Geçersiz Kaydet

Kaydetme yöntemimde, nesnenin geçersiz olarak kaydedilemediğini nasıl bilebilirim? Kullanıcının Kaydet düğmesini tıklamasını tercih ederim ve Kaydet düğmesini devre dışı bırakmak yerine onları bir sorundan haberdar edebilirim.

Alkış,

Dave

cevap

5

bunu yapmak için kolay bir yol bulamadı. Formdaki tüm denetimlerde tekrarlamak için tuzakların etrafında bazı kodlar buldum ve bunların herhangi birinde doğrulama hataları olup olmadığını belirledim. Ben bir uzantısı yöntemine dönüştürerek sona erdi:

var errors = this.GetErrors(); 
if (errors.Count > 0) 
{ 
    MessageBox.Show(errors[0].ErrorContent.ToString()); 
    return; 
} 

Bu çok daha fazla iş olması gerektiği oluyor daha: Kullanıcı bir form üzerinde Kaydet düğmesini tıkladığında Öyleyse

// Validate all dependency objects in a window 
internal static IList<ValidationError> GetErrors(this DependencyObject node) 
{ 
    // Check if dependency object was passed 
    if (node != null) 
    { 
     // Check if dependency object is valid. 
     // NOTE: Validation.GetHasError works for controls that have validation rules attached 
     bool isValid = !Validation.GetHasError(node); 
     if (!isValid) 
     { 
      // If the dependency object is invalid, and it can receive the focus, 
      // set the focus 
      if (node is IInputElement) Keyboard.Focus((IInputElement)node); 
      return Validation.GetErrors(node); 
     } 
    } 

    // If this dependency object is valid, check all child dependency objects 
    foreach (object subnode in LogicalTreeHelper.GetChildren(node)) 
    { 
     if (subnode is DependencyObject) 
     { 
      // If a child dependency object is invalid, return false immediately, 
      // otherwise keep checking 
      var errors = GetErrors((DependencyObject)subnode); 
      if (errors.Count > 0) return errors; 
     } 
    } 

    // All dependency objects are valid 
    return new ValidationError[0]; 
} 

, bunu Ancak, uzantı yöntemini kullanarak biraz kolaylaştırır.

+0

Bu güzel bir çözümdür. Teşekkür ederim. – Jirapong

3

Ardından, dilerseniz Binding s tarihinde true için NotifyOnValidationError ayarlamak bazı ana elemana Error olay için bir işleyici ekleyebilir. Bir hata eklendiğinde veya kaldırıldığında olay tetiklenir.

+0

Harika Fikir! Koduma uyguladığımda çözümümü göndereceğim! –

İlgili konular