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