Die Implementierung von INotifyPropertyChanged für verschachtelte Eigenschaften

Ich habe eine Klasse "Person":

public class Person : INotifyPropertyChanged
{
     private string _name;
     public string Name{
     get { return _name; }
     set {
           if ( _name != value ) {
             _name = value;
             OnPropertyChanged( "Name" );
           }
     }

     private Address _primaryAddress;
     public Address PrimaryAddress {
     get { return _primaryAddress; }
     set {
           if ( _primaryAddress != value ) {
             _primaryAddress = value;
             OnPropertyChanged( "PrimaryAddress" );
           }
     }

     //OnPropertyChanged code goes here
}

Ich habe eine Adresse der Klasse:

public class Address : INotifyPropertyChanged
{
     private string _streetone;
     public string StreetOne{
     get { return _streetone; }
     set {
           if ( _streetone != value ) {
             _streetone = value;
             OnPropertyChanged( "StreetOne" );
           }
     }

     //Other fields here

     //OnPropertyChanged code goes here
}

Habe ich ein ViewModel:

public class MyViewModel
{
   //constructor and other stuff here

     private Person _person;
     public Person Person{
     get { return _person; }
     set {
           if ( _person != value ) {
             _person = value;
             OnPropertyChanged( "Person" );
           }
     }

}

Ich habe eine Ansicht mit den folgenden Zeilen:

<TextBox  Text="{Binding Person.Name, Mode=TwoWay,   
    UpdateSourceTrigger=PropertyChanged />

<TextBox  Text="{Binding Person.Address.StreetOne, Mode=TwoWay,   
    UpdateSourceTrigger=PropertyChanged />

Beide Werte zeigen sich in der text-box ok, wenn die Ansicht geladen.

Änderungen in das erste Textfeld wird Feuer OnPropertyChanged( "Person" ) im MyViewModel. Toll.

Änderungen in das zweite Textfeld ("Person.Address.StreetOne") NICHT Feuer OnPropertyChanged( "Person" ) innen MyViewModel. Das heißt nicht, rufen Sie die Person-Objekt-SATZ-Methode. Nicht so toll. Interessanterweise ist die SET-Methode von StreetOne innerhalb der Address-Klasse aufgerufen wird.

Wie bekomme ich die SET-Methode der Person-Objekt in der ViewModel aufgerufen wird, wenn Person.Address.StreetOne geändert wird???

Muss ich reduzieren meine Daten so SteetOne ist im inneren Menschen und nicht die Adresse??

Dank!

  • Bezüglich deiner Güte die Frage bereits beantwortet wurde. Also, welche Art von Antwort Sie suchen, hier?
  • die akzeptierte Antwort ist ein workaround ist die Abflachung der Eigenschaft.. ich war auf der Suche für eine echte Lösung
  • Ich fügte hinzu, eine Antwort mit der standard-alternative, die zu propagieren der änderungen vom Kind zu den Eltern mit einem event-handler. Ich bin nicht sicher, wie dies übersehen wurde in der ursprünglichen Antworten, da es ziemlich standard ist und eine "echte" Lösung.
  • danke!
Schreibe einen Kommentar