2013-07-26 9 views
5

कैंट लगता है कि मैं कहां गलत हो रहा हूं? OnPropertyChange किसी भी सुझाव पर पुनर्विचार नहीं किया जा रहा है?OnPropertyChange वर्तमान संदर्भ में मौजूद नहीं है?

public class MedicationList : INotifyPropertyChanged 
{ 



    public int MedicationID { get; set; } 

    public string Description 
    { 
     get 
     { 
      return Description; 
     } 
     set 
     { 
      OnPropertyChanged("Description"); 
      Description = value; 

     } 
    } 
} 

}

संपादित मैं public class MedicationList : INotifyPropertyChanged

+1

क्या आपने अपनी 'मेडिकललिस्ट' कक्षा में कहीं भी 'ऑनप्रॉपर्टी चेंज' विधि घोषित की है? मुझे यह नहीं दिख रहा है। –

+5

रिकर्सन का पता चला: 'विवरण = मान;' –

+0

आपकी कक्षा को INOTifyPropertyChanged इंटरफेस –

उत्तर

6

जोड़ लिया है आप INotifyPropertyChanged इंटरफ़ेस है, जो एक PropertyChanged घटना की घोषणा की है लागू करना चाहिए। यदि वस्तु के कुछ गुण बदल गए हैं तो आपको यह घटना बढ़ाना चाहिए। सही कार्यान्वयन:

public class MedicationList : INotifyPropertyChanged 
{ 
    private string _description; // storage for property value 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string Description 
    { 
     get { return _description; } 
     set 
     { 
      if (_description == value) // check if value changed 
       return; // do nothing if value same 

      _description = value; // change value 
      OnPropertyChanged("Description"); // pass changed property name 
     } 
    } 

    // this method raises PropertyChanged event 
    protected void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) // if there is any subscribers 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

मुझे लगता है कि ओपी के लिए महत्वपूर्ण हिस्सा यह है कि 'ऑनप्रॉपर्टी चेंजेड' जादुई रूप से पतली हवा से बाहर नहीं दिखता है - यहां तक ​​कि कार्यान्वित इंटरफेस की सूची में 'INotifyPropertyChanged' जोड़ने पर भी नहीं। –

+0

वर्तमान संदर्भ में प्रॉपर्टी का परिवर्तन वर्तमान संदर्भ में मौजूद नहीं है – Mark

+0

@ मार्क वास्तव में यह वर्ग परिभाषा –

2

मुझे यकीन है कि आप इस तरह कुछ करना चाहता हूँ:

public class MedicationList : INotifyPropertyChanged { 
    public int MedicationID { get; set; } 
    private string m_Description; 

    public string Description { 
    get { return m_Description; } 
    set { 
     m_Description = value; 
     OnPropertyChanged("Description"); 
    } 
    } 

    private void OnPropertyChanged(string propertyName) { 
    if (string.IsNullOrEmpty(propertyName)) 
     throw new ArgumentNullException("propertyName"); 

    var changed = PropertyChanged; 
    if (changed != null) { 
     changed(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
+4

रिकर्सन भी यहां पता चला। :) विवरण = मूल्य – Nitesh

+0

@ नीतेश - अच्छी पकड़, तय :) –

0

इस विधि अपने प्रकार के आधार पर परिभाषित करने की आवश्यकता INotifyPropertyChanged::PropertyChanged घटना

public PropertyChangedEventHandler PropertyChanged; 

... 

private void OnPropertyChanged(string propertyName) { 
    var saved = PropertyChanged; 
    if (saved != null) { 
    var e = new PropertyChangedEventArgs(propertyName); 
    saved(this, e); 
    } 
} 
1

आप की जरूरत है बढ़ाने के लिए वास्तविक कोड इंटरफ़ेस आपकी कक्षा के अंदर लागू होता है।

/// <summary> 
/// Public event for notifying the view when a property changes. 
/// </summary> 
public event PropertyChangedEventHandler PropertyChanged; 

/// <summary> 
/// Raises the PropertyChanged event for the supplied property. 
/// </summary> 
/// <param name="name">The property name.</param> 
internal void OnPropertyChanged(string name) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(name)); 
    } 
} 
0

बेस क्लास और इंटरफेस के बीच एक अंतर है।

आधार वर्ग के साथ, सदस्यों को स्वचालित रूप से विरासत में प्राप्त किया जाता है और किसी को कुछ भी करने की आवश्यकता नहीं होती है (सिवाय इसके कि कुछ सदस्यों को override की आवश्यकता है)। एक इंटरफ़ेस के साथ, कक्षा स्वचालित रूप से इंटरफ़ेस सदस्यों का वारिस नहीं करती है; आपको उन्हें अपनी कक्षा में पेश करना होगा। यदि आप संकलक शिकायत नहीं करेंगे।

INotifyPropertyChanged एक इंटरफ़ेस है।

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