2009-05-18 14 views
5

चलो कहते हैं कि मैं एक साधारण वर्गडाटा बाध्यकारी और सेटर में अपवाद फेंक

public class Person 
{ 
    public string Name { get; set; } 

    private int _age; 
    public int Age 
    { 
    get { return _age; } 
    set 
    { 
     if(value < 0 || value > 150) 
     throw new ValidationException("Person age is incorrect"); 
     _age = value; 
    } 
    } 
} 

तब मैं सेटअप करना चाहते हैं इस वर्ग के लिए एक बाध्यकारी करते हैं:

txtAge.DataBindings.Add("Text", dataSource, "Name"); 

अब अगर मैं में गलत उम्र मान दर्ज टेक्स्ट बॉक्स (200 कहें) सेटर में अपवाद निगल जाएगा और जब तक मैं टेक्स्टबॉक्स में मान को सही नहीं करता तब तक मैं कुछ भी करने में सक्षम नहीं होगा। मेरा मतलब है कि टेक्स्टबॉक्स फोकस खोने में सक्षम नहीं होगा। यह सब चुप है - कोई गलती नहीं - जब तक आप मूल्य को सही नहीं करते हैं तब तक आप कुछ भी नहीं कर सकते (यहां तक ​​कि फ़ॉर्म या पूरे एप्लिकेशन को बंद भी नहीं कर सकते)।

यह एक बग की तरह लगता है, लेकिन सवाल यह है कि: इसके लिए एक समाधान क्या है?

हम BinsingSource, CurrencyManager या BindingBanagerBase वर्ग के BindingComplete घटना को संभालने की जरूरत है:

+1

क्या कोई कारण है कि आप IDataErrorInfo को लागू करने के बजाय अपवाद फेंक रहे हैं? मुझे लगता है कि उत्तरार्द्ध WinForms में अधिक मूर्खतापूर्ण दृष्टिकोण है (और यह अभी भी WPF में अच्छी तरह से काम करता है)। –

उत्तर

3

ठीक है, यहाँ समाधान है। कोड इस तरह दिख सकता है:

/* Note the 4th parameter, if it is not set, the event will not be fired. 
It seems like an unexpected behavior, as this parameter is called 
formattingEnabled and based on its name it shouldn't affect BindingComplete 
event, but it does. */ 
txtAge.DataBindings.Add("Text", dataSource, "Name", true) 
.BindingManagerBase.BindingComplete += BindingManagerBase_BindingComplete; 

... 

void BindingManagerBase_BindingComplete(
    object sender, BindingCompleteEventArgs e) 
{ 
    if (e.Exception != null) 
    { 
    // this will show message to user, so it won't be silent anymore 
    MessageBox.Show(e.Exception.Message); 
    // this will return value in the bound control to a previous correct value 
    e.Binding.ReadValue(); 
    } 
} 
+0

huuh ... IDataErrorInfo को लागू करने के बारे में सोचें –

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