2009-03-13 20 views
6

को बचाने के लिए ऑब्जेक्ट को निर्धारित करने के लिए अमान्य है, मेरे पास एक WPF अनुप्रयोग में एक टेक्स्टबॉक्स है जो एक लिंक से एंटीटीज़ क्लास पर एक संपत्ति के लिए बाध्य है जो IDataErrorInfo लागू करता है। टेक्स्टबॉक्स बाइंडिंग में ValidatesOnExceptions = True और ValidatesOnDataErrors = True है। जब टेक्स्टबॉक्स एक पूर्णांक संपत्ति से बंधे होते हैं और उपयोगकर्ता टेक्स्ट में प्रवेश करता है तो टेक्स्टबॉक्स रूपरेखा लाल रंग के रूप में प्रदर्शित होती है क्योंकि मैंने कस्टम शैली सेट नहीं की है।डब्ल्यूपीएफ बाध्यकारी -

मेरी बचत विधि में मुझे कैसे पता चलेगा कि वस्तु को सहेजा नहीं जा सकता क्योंकि यह अमान्य है? मैं चाहता हूं कि उपयोगकर्ता सहेजें बटन पर क्लिक करें और मैं सहेजें बटन को अक्षम करने के बजाय उन्हें किसी समस्या के बारे में सूचित कर सकता हूं।

चीयर्स,

डेव

उत्तर

5

मैं यह करने के लिए एक आसान तरीका नहीं मिली है। मुझे फॉर्म पर सभी नियंत्रणों के माध्यम से रिकर्स करने के लिए जाल के चारों ओर कुछ कोड मिला और यह निर्धारित किया गया कि उनमें से किसी के पास सत्यापन त्रुटियां हैं या नहीं। मैं एक विस्तार विधि में बदलकर समाप्त हो गया:

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

यह एक बहुत अधिक काम की तुलना में यह होना चाहिए है:

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

तो फिर जब उपयोगकर्ता एक फार्म पर सहेजें बटन क्लिक करता है, मैं यह कर , लेकिन विस्तार विधि का उपयोग करके इसे थोड़ा सा सरल बना दिया जाता है।

+0

यह अच्छा समाधान है। धन्यवाद। – Jirapong

3

आप अपने Binding रों पर true को NotifyOnValidationError सेट कर सकते हैं, तो कुछ माता पिता तत्व पर Error घटना के लिए कोई हैंडलर जोड़ें। जब भी कोई त्रुटि जोड़ा या हटा दिया जाता है तो ईवेंट आग लग जाएगा।

+0

भयानक विचार! एक बार जब मैं इसे अपने कोड पर लागू करता हूं तो मैं अपना समाधान पोस्ट करूंगा! –

संबंधित मुद्दे