2011-11-18 12 views
6

मेरे पास एक फ़ंक्शन, void Validate() है, जिसमें विंडो के लिए मेरे सभी सत्यापन तर्क शामिल हैं।विभिन्न ईवेंट हैंडलर प्रतिनिधियों के साथ एकाधिक नियंत्रणों के लिए एक एकल ईवेंट हैंडलर को कार्यान्वित करना

मैं इसे एक ईवेंट हैंडलर के रूप में पंजीकृत नहीं कर सकता क्योंकि यह ईवेंट हैंडलर प्रतिनिधियों द्वारा आवश्यक पैरामीटर स्वीकार नहीं करता है। इसके अतिरिक्त विभिन्न प्रकार के नियंत्रणों में अलग-अलग हस्ताक्षर होते हैं, इसलिए मेरे पास Validate नहीं हो सकता है, जबकि उनकी सामग्री को अनदेखा करते समय एक हस्ताक्षर से मेल खाता है।

यहाँ मैं सेटअप

txt1.TextChanged += Validate_TextChange; 
    password1.PasswordChanged += Validate_RoutedEvent; 
    txt2.TextChanged += Validate_TextChange; 

    txt3.TextChanged += Validate_TextChange; 
    password2.PasswordChanged += Validate_RoutedEvent; 
    txt4.TextChanged += Validate_TextChange; 


void Validate_RoutedEvent(object sender, RoutedEventArgs e) 
{ 
    ValidateOptions(); 
} 

void Validate_TextChange(object sender, TextChangedEventArgs e) 
{ 
    ValidateOptions(); 
} 

public void ValidateOptions() 
{ 
    //Actual validation here 
} 

है यह सिर्फ 2 उदाहरण है, और अधिक नियंत्रण हो सकता है और भी अधिक हस्ताक्षर से पता चलता का एक छोटा सा उदाहरण है। क्या सभी इवेंट हैंडलर किसी ऐसे मामले में एक समारोह को कॉल करने का कोई बेहतर तरीका है जहां मुझे पारित होने वाले तर्कों की परवाह नहीं है?


संपादित करें: मैं पैरामीटर जोड़ने के लिए और उन्हें अनदेखा विकल्प जॉन द्वारा प्रस्तावित की तरह। इससे अधिकांश समस्याएं हल होती हैं लेकिन जब भी मैं इस फ़ंक्शन को सीधे कॉल करना चाहता हूं, जैसे मैन्युअल रूप से सत्यापन को ट्रिगर करना, तो मुझे कंपाइलर को संतुष्ट करने के लिए डमी तर्क शामिल करना होगा। मान्यकरण (यह, नया EventArgs())

अज्ञात कार्यों का उपयोग करने के लिए दान दान ने सुझाव दिया है, लेकिन ईवेंट हैंडलर को जोड़ते समय यह उतना साफ नहीं होगा।

ऐसा प्रतीत नहीं होता है कि या तो समाधान आपको हस्ताक्षर को अनदेखा करते समय एक ईवेंट हैंडलर के रूप में फ़ंक्शन पंजीकृत करने देता है जबकि डमी तर्क बनाये बिना फ़ंक्शन को कॉल करने की क्षमता को संरक्षित करता है लेकिन बहुत करीब पाने के कई तरीके हैं।


संपादित करें:

यहाँ अद्यतन उदाहरण सामान्य घटना से निपटने के लिए जॉन की समाधान को लागू करने, लेकिन एक 0 पैरामीटर समारोह है कि सीधे

txt1.TextChanged += ValidationEvent; 
password1.PasswordChanged += ValidationEvent; 
txt2.TextChanged += ValidationEvent; 

txt3.TextChanged += ValidationEvent; 
password2.PasswordChanged += ValidationEvent; 
txt4.TextChanged += ValidationEvent; 


//Single event handler accepting EventArgs, which is the base class 
//for all more-specific event classes 
void ValidationEvent(object sender, EventArgs e) 
{ 
    //Ignores arguments and calls 0 argument ValidateOptions 
    ValidateOptions(); 
} 

//0 argument function that performs actual validation and can be called 
//directly from other functions without the need to pass in a fake sender 
//and eventargs parameter 
public void ValidateOptions() 
{ 
    //Actual validation here 
} 

उत्तर

6

आप एक भी विधि है जो पैरामीटर को अनदेखा कर सकते हैं कि पहला पैरामीटर sender है और दूसरा पैरामीटर EventArgs से प्राप्त कुछ प्रकार है।

+0

भी हस्ताक्षर 'शून्य (वस्तु, वस्तु)' वास्तव में काम करेगा। –

+2

@ एचबी।: सच - मैं यह स्पष्ट करना चाहता हूं कि यह इवेंट हैंडलिंग के लिए है :) –

+0

@ जोन मुझे यह पसंद है, और यह काम करता है, लेकिन मुझे तब एहसास हुआ कि मैंने अपने मूल प्रश्न (अपडेटेड) में उपयोग के मामले का हिस्सा उपेक्षित किया है। । एक कारण वैलिडेट() फ़ंक्शन पहले से ऐसा नहीं कर रहा था क्योंकि मैं इसे अन्य कार्यों से सत्यापन को मजबूर करने के लिए कॉल करना चाहता था और इस दृष्टिकोण के साथ मैं ईवेंट हैंडलर उपयोग को सरल बना देता हूं लेकिन इसे सीधे कॉल करते समय नकली मानों का उपयोग करना पड़ता हूं। – Eric

5
कम करने के लिए

आप लैम्ब्डा भाव का उपयोग कर सकते कहा जा सकता है रखने है रैपर के लिए लिखने वाले कोड की मात्रा, हालांकि, दृश्यों के पीछे, यह अभी भी पैरामीटर को त्यागने के लिए रैपर विधियां बना रही है। सामान्य घटना पैटर्न जैसे कि निम्न

public void ValidateOptions(object sender, EventArgs e) 
{ 
} 

संकलक किसी भी प्रतिनिधि प्रकार करने के लिए ValidateOptions विधि समूह से एक रूपांतरण की अनुमति देगा:

txt3.TextChanged += (s,e) => ValidateOptions(); 
password2.PasswordChanged += (s,e) => ValidateOptions(); 
txt4.TextChanged += (s,e) => ValidateOptions(); 
0

यह हैंडलर ढांचे नियंत्रण के लिए एक एकल कॉलबैक प्रदान करता है और तर्क 'ई' की खपत के लिए संरक्षित है ...

private static void EventHandlerSink(object sender, dynamic e) 
    { 

    } 
+0

'घटनाक्रम' से सभी ईवेंट तर्कों का उत्तराधिकारी होने पर 'गतिशील' का उपयोग करने की कोई आवश्यकता नहीं है, आप उस बॉक्सिंग के दौरान छोड़े गए छोटे इंटरफ़ेस को खो देते हैं। –

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