2010-11-27 14 views
2

基本クラスのプロパティのSystem.ComponentModel.INotifyPropertyChangedインターフェイスを暗示したいと思いますが、どのように接続するかはわかりません。WPF - 基本クラスのSystem.ComponentModel.INotifyPropertyChangedの実装

ここで私はの通知を取得したいのですがプロパティの署名です:

public abstract bool HasChanged(); 

し、変更を処理するための基本クラスで私のコード:私は扱うにはどうすればよい

public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

private void OnPropertyChanged(String info) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(info)); 
    } 
} 

各子クラスでOnPropertyChanged()を呼び出す必要なく、基本クラスのイベントの接続

おかげで、
ソニー

EDIT: OK ...私はときHASCHANGED()変更の値が、私はOnPropertyChanged("HasChanged")を呼ぶことになってんだけど、私が手にするかどうかはわかりませんと思いますそれを基底クラスに追加します。何か案は?

+0

、これが不可能です。 – Jon

+0

また、 'HasChanged'はプロパティではなく、ここでのメソッドです。コピー/貼り付けエラー? – Jon

+0

が真ではない場合、彼はまだ基本クラスのプロパティを更新できます。下記の私の編集された答えを見てください。 – VoodooChild

答えて

2

これはあなたの後のことですか?

public abstract class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    //make it protected, so it is accessible from Child classes 
    protected void OnPropertyChanged(String info) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

} 

OnPropertyChangedアクセス可能レベルが保護されていることに注意してください。そして、あなたの具体的なクラスや子クラスで、次の操作を行います。

public class PersonViewModel : ViewModelBase 
{ 

    public PersonViewModel(Person person) 
    { 
     this.person = person; 
    } 

    public string Name 
    { 
     get 
     { 
      return this.person.Name; 
     } 
     set 
     { 
      this.person.Name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 
} 

EDITを:再びOPの質問を読んだ後、私は彼が子クラスでOnPropertyChangedを呼び出すために望んでいないことを認識したので、私はかなり確信していますこれは動作します:

public abstract class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private bool hasChanged = false; 
    public bool HasChanged 
    { 
     get 
     { 
      return this.hasChanged; 
     } 
     set 
     { 
      this.hasChanged = value; 
      OnPropertyChanged("HasChanged"); 
     } 
    } 

    //make it protected, so it is accessible from Child classes 
    protected void OnPropertyChanged(String info) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

と子クラスで:一般的に言って

public class PersonViewModel : ViewModelBase 
{ 
    public PersonViewModel() 
    { 
     base.HasChanged = true; 
    } 
} 
+0

変更されたイベントを設定して変更する前に、値とバッキングフィールドが等しいかどうかを確認する必要があります(value!= this.person.name) –

+0

@ Muad'Dib: 'this.person'はnullになる可能性がありますので、これはですか?または何も変更されていない場合、イベントを発生させたくないためですか? – VoodooChild

+0

@VoodooChildイベントを発生させたくないからです。つまり、あなたがそれを上げ、何も変わっていなければ、本質的に、あなたは横たわっています。また、あなたが不必要に変更されたイベントを起こしているなら、あなたは腰を撫でていて、減速しています。 –

関連する問題