2011-02-10 6 views
0

私は決してwuth INotifyPropertyChangedを動かすことはありません。私は記事を読んでいて、そこからINotifyPropertyChangedに関連するコードが見つかりました。についてINotifyPropertyChanged

public class ContactModel : INotifyPropertyChanged 
{ 
    private string _firstName; 

    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      _firstName = value; 
      RaisePropertyChanged("FirstName"); 
      RaisePropertyChanged("FullName"); 
     } 
    } 

    private string _lastName; 

    public string LastName 
    { 
     get { return _lastName; } 
     set 
     { 
      _lastName = value; 
      RaisePropertyChanged("LastName"); 
      RaisePropertyChanged("FullName"); 
     } 
    } 

    public string FullName 
    { 
     get { return string.Format("{0} {1}", FirstName, LastName); } 
    } 



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

    public event PropertyChangedEventHandler PropertyChanged; 

    public override bool Equals(object obj) 
    { 
     return obj is ContactModel && ((ContactModel) obj).FullName.Equals(FullName); 
    } 

    public override int GetHashCode() 
    { 
     return FullName.GetHashCode(); 
    } 
} 

上記のコードからRaisePropertyChanged( "FirstName");が見つかりました。常にプロパティセッターから呼び出されます。 RaisePropertyChangedを呼び出す必要がある理由私は良いexplainationのためのGoogleを検索するが、私は良いリンクを発見していない。誰かがRaisePropertyChangedがsetterから呼び出す必要がある理由を説明してください。

おかげ

+0

イベントの一般的な仕組みを理解していますか? –

答えて

3

WPFはPropertyChangedイベントに登録し、これはつまり、あなたが財産とテキストボックスのテキストの変更を変更、結合作業を行いますので。

また、イベントの発生パターンは標準的なものです。イベントは保護されたメソッドを介して生成され、サブクラスはそれをオフにしたり、動作を変更することができます。

私は実際に名前を確認する私の見解モデルにもう少し持っている - もともとジョシュ・スミスによって:プロパティは、実際に変更された場合あなたは、イベントをrasingことで、プロパティのセッターの中身をチェックする必要があり

public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 

     VerifyPropertyName(propertyName); 

     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    protected void OnPropertyChanged(object sender, string propertyName) 
    { 
     PropertyChanged(sender, new PropertyChangedEventArgs(propertyName)); 
    } 

    public void VerifyPropertyName(string propertyName) 
    { 

     if (TypeDescriptor.GetProperties(this)[propertyName] == null) 
     { 
      throw new Exception("Invalid property name: " + propertyName); 
     } 
    } 
2

 set 
     { 
      if (lastname != value) 
      { 
       _lastName = value; 
       RaisePropertyChanged("LastName"); 
       RaisePropertyChanged("FullName"); 
      } 
     } 

トンに加入している任意のクラスを:を持ってあなたプロパティがを変更を通知することができますPropertyChangedイベントはプロパティが変更されたことを通知され、バインディングを更新できます。

+0

あなたが顧客クラスを想定していてnameという名前のプロパティを1つ持っていて、そのクラスのオブジェクトを作成した後にコードから名前を変更すると、プロパティが変わるだけです。私はINotifyPropertyChangedインターフェイスに関連するコードを少し読んだ後に、プロパティが変更された呼び出し環境にレポートを呼び出すことができ、その結果、ユーザーはプロパティ変更後にイベントから独自のコードを記述できるようになりました。 – Thomas

1

これは、購読しているすべての受信者が、プロパティが変更されたことを示すメッセージを受け取るため、値を適宜更新する必要があるためです。たとえば、グリッドがテキストを変更します。

また、FullNameプロパティを更新した理由は、姓名プロパティが人物のFullNameに直接影響するため、バインディングにこれらの値が反映されるためです。

+0

小さなサンプルの助けを借りて私はどのようにINotifyPropertyChangedインターフェイスを使用して恩恵を受けることができますか教えてください。プロパティが変更されると、バインディングは自動的に変更を反映するか、コントロールに変更を表示させるためのコードを記述する必要があります。ありがとう – Thomas

関連する問題