2008-10-20 15 views
7

अगर मैं एक संपत्ति है:सी # कस्टम घटना संचालकों

public list<String> names { get; set; } 

मैं कैसे पैदा करते हैं और संभाल बुलाया तर्क खातिर के लिए एक कस्टम इवेंट 'onNamesChanged' जब भी कोई नाम सूची में जोड़ा जाता है कर सकते हैं?

उत्तर

-1

आपको सीधे संपत्ति के रूप में सूची का पर्दाफाश करने की आवश्यकता नहीं होगी और शायद आपकी कक्षा ILI को लागू करेगी या ऐसे में आपके ईवेंट हैंडलर को एड() विधि पर आग लगाना होगा।

+0

ऐसा है .NET 1.1 :) मार्क ग्रेवेल ने कहा ... बहुत सारे काम, थोड़ा लाभ। –

0

डेविड मोहुंड्रो एक दृष्टिकोण दिखाता है; काम के बहुत सारे, थोड़ा लाभ - (IList, IList < टी >) पहले सिद्धांतों से आप अपनी स्वयं की सूची बना सकते हैं,

class Foo {} 
class FooCollection : Collection<Foo> 
{ 
    protected override void InsertItem(int index, Foo item) 
    { 
     // your code... 
     base.InsertItem(index, item); 
    } 
    protected override void SetItem(int index, Foo item) 
    { 
     // your code... 
     base.SetItem(index, item); 
    } 
    // etc 
} 

अंत में: एक अन्य विकल्प संग्रह < टी > से विरासत और विभिन्न तरीकों ओवरराइड करने के लिए है ।

13

एक बाइंडिंगलिस्ट संभवतः आपका सबसे अच्छा विकल्प है क्योंकि इसमें अंतर्निहित परिवर्तन ट्रैकिंग और विभिन्न प्रकार की मौजूदा घटनाएं हैं जिनका आप उपयोग कर सकते हैं। नीचे बाइंडिंगलिस्ट ईवेंट को आगे बढ़ाने के लिए एक कस्टम ईवेंट का खुलासा करने का एक उदाहरण नीचे दिया गया है। BindingList को


    class Example 
    { 
     private BindingList<string> m_names = new BindingList<string>(); 
     public IEnumerable<string> Names { get { return m_names; } } 
     public event AddingNewEventHandler NamesAdded 
     { 
      add { m_names.AddingNew += value; } 
      remove { m_names.AddingNew -= value; } 
     } 
     public void Add(string name) 
     { 
      m_names.Add(name); 
     } 
    } 
+1

डांग। मैं आज एक और नई बात सीखता हूं। :) –

+1

वाह, मुझे नहीं पता था कि आप घटनाओं के साथ ऐसा कर सकते हैं! बहुत चिकना है! –

+1

बहुत अच्छा। मुझे नहीं पता था कि यह संभव था – Steve

10

एक वैकल्पिक ObservableCollection है - इस मामले में आप CollectionChanged घटना के लिए अपने स्वयं के ईवेंट हैंडलर सदस्यता लें और कार्रवाई के आधार पर अपने ईवेंट को सक्रिय करना चाहते हैं।

+0

यहां एक और वोट दें। मैं अभी भी सीखना बंद नहीं कर सकता :) –

0

एक गैर-रूढ़िवादी दृष्टिकोण एक एओपी ढांचे का उपयोग कर सकता है जैसे कि पोस्टशर्प को एक्सेसर कहने से पहले/बाद में एक हैंडलर "बुनाई" करने के लिए, जो एक घटना को आग लगती है।

आप एक बाहरी कक्षा बनाते हैं जिसमें आपकी संपत्ति का उपयोग होने पर पूर्व और/या पोस्ट हैंडलिंग कोड होता है, जांच करें कि संपत्ति का मूल्य पूर्व और पोस्ट के बीच बदल गया है, और कोई ईवेंट बढ़ाएं।

ध्यान रखें कि तुलना के लिए मूल्य (आपके हैंडलर कोड के अंदर) लेते समय, आप एक अनंत लूप में जा सकते हैं (आप संपत्ति एक्सेसर को कॉल करते हैं, जो एओपी हैंडलर को कॉल करता है, जो एक्सेसर को कॉल करता है और इसी तरह) इसलिए आपको बैकिंग फ़ील्ड प्राप्त करने के लिए इस संपत्ति वाले वर्ग में प्रतिबिंबित करने की आवश्यकता हो सकती है।

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