2013-07-26 20 views
5

Cant wydaje się widzieć, gdzie idę źle? OnPropertyChange nie jest rekondnised żadnych sugestii?OnPropertyChange nie istnieje w bieżącym kontekście?

public class MedicationList : INotifyPropertyChanged 
{ 



    public int MedicationID { get; set; } 

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

     } 
    } 
} 

}

EDIT Dodałem public class MedicationList : INotifyPropertyChanged

+1

Czy zadeklarowałeś metodę 'OnPropertyChanged' w dowolnym miejscu swojej klasy' MedicationList'? Nie widzę tego. –

+5

Wykryto rekursję: 'Description = value;' –

+0

Twoja klasa musi implementować interfejs INotifyPropertyChanged –

Odpowiedz

6

Należy wdrożyć INotifyPropertyChanged interfejs, który ma jeden PropertyChanged zdarzenie zgłoszone. Powinieneś podnieść to wydarzenie, jeśli zmieniły się niektóre właściwości obiektu. Prawidłowa realizacja:

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

Myślę, że ważną częścią OP jest to, że 'OnPropertyChanged' nie pojawia się magicznie z powietrza - nawet przy dodawaniu' INotifyPropertyChanged' do listy zaimplementowanych interfejsów. –

+0

Nazwa onPropertychange nie istnieje w bieżącym kontekście – Mark

+0

@Mark faktycznie istnieje, na dole definicji klasy –

2

założę chcesz zrobić coś takiego:

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

Wykryto także rekursję. :) Opis = wartość – Nitesh

+0

@Nitesh - dobry połów, naprawiony :) –

0

Metoda ta musi być określona przez typ podniesienia zdarzenie 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

Musisz rzeczywisty kod implementowany przez interfejs wewnątrz klasy.

/// <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

Istnieje różnica między klasą bazową a interfejsem.

Z klasą podstawową członkowie są automatycznie dziedziczeni i nie trzeba nic robić (chyba że niektórzy członkowie potrzebują override). Dzięki interfejsowi klasa nie dziedziczy automatycznie elementów interfejsu; musisz je wprowadzić w swojej klasie. Jeśli nie, kompilator będzie narzekał.

INotifyPropertyChanged to interfejs.

Powiązane problemy