2010-11-08 12 views
7

हे दोस्तों, क्या कोई ऐसा ईवेंट बनाने का कोई तरीका है जो किसी ऑब्जेक्ट के गुण/फ़ील्ड मानों को बदलता है? उदाहरण के लिए, यदि वस्तु एक क्षेत्रसी #: किसी ऑब्जेक्ट के फ़ील्ड मानों को बदलने के लिए एक ईवेंट बनाएं

private int number; 

कहा जाता है और उपयोगकर्ता कोई ऐसा कार्य है कि उस नंबर को अपडेट करेंगे करता है, एक घटना है कि फार्म पर टेक्स्ट बॉक्स के सभी अद्यतन होगा आग वर्तमान क्षेत्र मूल्यों को प्रदर्शित करने हैं?

संपादित करें: क्षमा करें, हाँ गुण प्रत्येक क्षेत्र

+0

आईएम केवल 200 स्तर की प्रोग्रामिंग कक्षा में। मैं फॉर्म नियंत्रणों को समझता हूं। लेकिन जिस वस्तु का मैं जिक्र कर रहा हूं वह एक वर्ग का उदाहरण है जिसे मैंने बनाया है। चूंकि ऑब्जेक्ट्स में कई मान हैं, इसलिए मैं थोड़ा उलझन में हूं कि अगर कोई भी बदलता है तो ट्रैक करने के लिए किसी ईवेंट को कैसे पंजीकृत किया जाए। – Sinaesthetic

उत्तर

19

यह एक क्षेत्र की तुलना में एक संपत्ति के बजाय, और अपनी कक्षा में INotifyPropertyChanged लागू:

class YourClass : INotifyPropertyChanged 
{ 

    private int _number; 
    public int Number 
    { 
     get { return _number; } 
     private set 
     { 
      _number = value; 
      OnPropertyChanged("Number"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

} 

फिर आप PropertyChanged घटना के लिए स्पष्ट रूप से सुन सकते हैं, या बाध्यकारी है कि यह स्वचालित रूप से

+0

प्रत्येक बार जब कोई संपत्ति बदल जाती है तो लॉग इन करने के लिए यह सामान्य अभ्यास है? –

+0

@ एल - '''--------- '' '' '' '' '' '' '', मुझे नहीं लगता कि यह है, क्यों? –

+0

मैं सोच रहा हूं कि ऐसा क्यों नहीं होगा क्योंकि आपके पास पूर्ण लॉग होने पर उत्पादन समस्याओं का निवारण करना इतना आसान है (प्रत्येक संपत्ति में परिवर्तनों को लॉग इन करने के बारे में बात कर रहा हूं) –

1

लगता है कि आपने INotifyPropertyChanged इंटरफेस की जांच करनी चाहिए के लिए बनाए गए हैं। हालांकि यह फ़ील्ड के लिए काम नहीं करता है, और आपको इसे मैन्युअल रूप से कार्यान्वित करना होगा।

0
संभाल लेंगे एक डेटा का उपयोग

आप इसका उपयोग कहां जा रहे हैं?

यदि आप इसे क्लाइंट एप्लिकेशन में उपयोग करने जा रहे हैं तो implementing INotifyPropertyChanged काम करने का अनुशंसित तरीका है।

+0

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

2

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

// We declare a delegate to handle our event 

delegate void StateChangedEventHandler(object sender, StateChangedEventArgs e); 

// We declare event arguments class to specify, which value has changed to which value. 

public class StateChangedEventArgs: EventArgs 
{ 
    string propertyName; 

    object oldValue; 
    object newValue; 

    /// <summary> 
    /// This is a constructor. 
    /// </summary> 
    public StateChangedEventArgs(string propertyName, object oldValue, object newValue) 
    { 
     this.propertyName = propertyName; 

     this.oldValue = oldValue; 
     this.newValue = newValue; 
    } 
} 

/// <summary> 
/// Our class that we wish to notify of state changes. 
/// </summary> 
public class Widget 
{ 
    private int x; 

    public event StateChangedEventHandler StateChanged; 

    // That is the user-defined property that fires the event manually; 

    public int Widget_X 
    { 
     get { return x; } 
     set 
     { 
      if (x != value) 
      { 
       int oldX = x; 
       x = value; 

       // The golden string which fires the event: 
       if(StateChanged != null) StateChanged.Invoke(this, new StateChangedEventArgs("x", oldX, x); 
      } 
     } 
    } 
} 

हमारे सदस्य चर निजी परिभाषित किया गया है, इसलिए वर्ग विजेट उस तक पहुँच सकते के बाहर कोई नहीं; उन्हें संपत्ति विजेट_एक्स का उपयोग करने के लिए मजबूर किया जाता है, और एक बार ऐसा करने के बाद, दो मामले होते हैं:

  • उन्हें x चर मिलता है। कुछ करने को नहीं है।
  • उन्होंने x वैरिएबल को पहले के समान मूल्य पर सेट किया था। कुछ करने को नहीं है। हम इसे सेटटर के अंदर जांचते हैं।
  • उन्होंने x चर सेट किया और इसे बदल दिया। यही वह जगह है जहां हम घटना को आग लगाते हैं।

यह जांचना महत्वपूर्ण है कि हमारे पास ईवेंट आयोजित करने से पहले हमारे पास कोई ईवेंट हैंडलर पंजीकृत है (यानी, हमारा ईवेंट शून्य नहीं है)। दूसरे मामले में, हमें एक अपवाद मिलेगा।

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