2013-07-26 22 views
5

私はどこが間違っているのか分かりませんか? OnPropertyChangeはどのような提案も再調整されていませんか?OnPropertyChangeは現在のコンテキストに存在しませんか?

public class MedicationList : INotifyPropertyChanged 
{ 



    public int MedicationID { get; set; } 

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

     } 
    } 
} 

}

EDIT私はあなたが宣言した単一PropertyChangedイベントがありINotifyPropertyChangedインタフェースを実装する必要があり

+1

あなたは 'OnPropertyChanged'メソッドをあなたの' MedicationList'クラスのどこにでも宣言しましたか?私はそれを見ない。 –

+5

再帰が検出されました: 'Description = value;' –

+0

クラスはINotifyPropertyChangedインターフェイスを実装する必要があります –

答えて

6

public class MedicationList : INotifyPropertyChangedを追加しました。オブジェクトのプロパティの一部が変更された場合は、このイベントを発生させる必要があります。正しい実装:私はあなたがこのような何かをしたい賭け

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

私は、OPの重要な部分は、OnPropertyChangedが魔法のように薄い空気の中に現れないことです.InotifyPropertyChangedを実装されたインターフェイスのリストに追加するときでさえもそうではありません。 –

+0

名前のonPropertychangeは現在のコンテキストに存在しません – Mark

+0

@Markは実際にはクラス定義の末尾にあります。 –

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

@ Nitesh - 良いキャッチ、固定:) –

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はインターフェイスです。

関連する問題