2011-12-22 14 views
3

私の質問は、ほぼ以下の既存の質問のようなものです: When nesting properties that implement INotifyPropertyChanged must the parent object propogate changes?詳細 - INotifyPropertyChangedを実装するネストプロパティは、親オブジェクトのpropogateを変更する必要がありますか?

私の質問です 人 連絡先 アドレスを次のように私は3つのレベルがある場合

public class Address : INotifyPropertyChanged 
    { 
     string m_city; 
     public string City 
     { 
      get { return m_city; } 
      set 
      { 
       m_city = value; 
       NotifyPropertyChanged(new PropertyChangedEventArgs("City")); 
      } 
     } 
    } 

    public class Contact : INotifyPropertyChanged 
    { 
     Address m_address; 

     public Address Address 
     { 
      get { return m_address = value; } 
      set 
      { 
       m_address = value; 
       NotifyPropertyChanged(new PropertyChangedEventArgs("Address")); 
      } 
     } 
    } 

    public class Person : INotifyPropertyChanged 
    { 
     Contact m_contact; 

     public Contact ContactInfo 
     { 
      get { return m_contact = value; } 
      set 
      { 
       m_contact = value; 
       NotifyPropertyChanged(new PropertyChangedEventArgs("ContactInfo")); 
      } 
     } 
    } 

私が含まれている人のユーザーコントロールを持っています連絡先のユーザーコントロール。 都市を変更すると、アドレスクラスのcityプロパティのnotifyPropertychangedが呼び出されます。また は、ContactクラスのAddressセッターもPersonクラスのContact Setterも呼び出さない。 市のプロパティが変更されたときに、その人のクラスにどのように通知できますか?彼らは例えばそれを

を使用することに興味があるなら

+0

に等しかった提供好きでそれらを扱うことになるたびに、このシステムでは、Addressクラスは、イベントをブロードキャストしますhttp://stackoverflow.com/questions/7577332/nested-inotifypropertychanged-class-wont-work –

+0

恥知らずのプラグイン:MadPropsには[propogation built-in](http://code.google.com/p/madprops/#Propogation )、プロパティを識別するための「マジック文字列」はありません。 –

答えて

0

他のクラスは、住所のPropertyChangedイベントに登録する必要がありますオブジェクト参照が変更されます場合は、Contactにのみ、そのような設定として、AddressPropertyChangedイベントを発生させますAddress = new Address()またはAddress = null。アドレスのプロパティは気にしません。あなたはそれがプロパティを気にしたい場合は、あなたがバブルにイベントをしたい場合は、Personクラスと同じことを行う必要があるだろう

public class Contact : INotifyPropertyChanged 
{ 
    Address m_address; 

    public Address Address 
    { 
     get { return m_address = value; } 
     set 
     { 
      // Remove old PropertyChanged notification if it existed 
      if (m_address != null) 
       m_address.PropertyChanged -= Address_PropertyChanged; 

      m_address = value; 

      // Add new PropertyChanged notification if it existed 
      if (m_address != null) 
       m_address.PropertyChanged += Address_PropertyChanged; 

      NotifyPropertyChanged(new PropertyChangedEventArgs("Address")); 
     } 
    } 
} 


void Address_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "City") 
     NotifyPropertyChanged(new PropertyChangedEventArgs("Address")); 
} 

Contact.Address PropertyChangeイベントを高めるためにAddress.PropertyChangedPropertyChangeイベントをフックアップPersonクラスまで。

また、MVVM LightのMessengerやMicrosoft PrismのEventAggregatorなどのメッセージングシステムを使用することもできます。 City変更、およびPersonクラスは、これらのメッセージを購読すると、あなたがメッセージを送ったAddressはこれを見てくださいPerson.Contact.Address

+0

Addressプロパティゲッターを確認してください。 get {return m_address = value; } 今、アドレスクラスのcityプロパティを変更します。連絡先クラスのAddressプロパティ設定メソッドは呼び出されません。 ここには何が欠けていますか? –

+0

@sayedsaadオブジェクトのプロパティを変更しても、変更されたプロパティに対してのみオブジェクト自体の 'PropertyChanged'通知は発生しません。したがって、 'Address.City'が変更された場合、' Address'クラスは 'City'プロパティの' PropertyChanged'イベントを発生させますが、 'Contact'は' Contact.Address'の 'PropertyChanged'イベントを発生させません。 'Address'オブジェクトは新しい値に変更されませんでした。そのような振る舞いが必要な場合は、 'Contact''に' Contact.Address.PropertyChanged'が呼び出されるたびに 'PropertyChanged'イベントを発生させるべきだということを伝えなければなりません – Rachel

関連する問題