2010-03-11 6 views
7
geändert wurde

Ich habe ein Szenario wie dieseautomatisch Property anheben, wenn eine Innenobjekteigenschaft

Class Parent 
{ 
    Property A; 
} 

Class A 
{ 
     Property X 
} 

Wie kann ich ein PropertyChangedNotification auf Property A erhalte, wenn X ändert? Ich möchte nicht "Eltern" in der Klasse A oder irgendeine Art von Veranstaltung nennen, die meine Entkoppelung beeinträchtigt. Was ich im Grunde will, ist die Parent.IsDirty==true machen. Dies ist eine sehr vereinfachte Version meiner Geschichte, ich habe Dutzende von Klassen wie Parent, also suche ich nach einem generischen Weg, damit umzugehen.

Bitte beachten Sie, dass dies nicht der tatsächliche Code ist. Ich habe alle INotifyPropertyChanged Implementierung. Ich frage mich nur ein einfacher Mechanismus wie RaisePropertyChanged("A.X")

Antwort

8

Sie können versuchen, das Ereignis propertychange in der übergeordneten Klasse zu registrieren. Im Konstruktor können Sie auf das Ereignis subribe:

public Parent() 
{ 
    A.OnPropertyChanged += OnAPropertyChanged; 
} 

void OnAPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "X") 
     if(PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("A")) 
} 

hoffe, das hilft ...

+0

ich diese Antwort würde die Wahl aber ich fühle mich MVVM messenger Muster ist das, was ich suche. –

+0

@RoelF funktioniert das immer noch in> = .Net 4.0? – Thomas

+0

@Thomas Ich sehe nicht, warum es eigentlich nicht ... – RoelF

0

Ich weiß nicht, ob dies die beste Praxis ist aber: was ist so etwas wie dieses:

private Movie movie; 
public Movie Movie 
{ 
    get { return movie; } 
    set 
    { 
     var oldProperties = typeof(Movie).GetProperties(); 
     foreach (var property in oldProperties) 
     { 
      if (property.GetValue(movie).GetHashCode() != value.GetType().GetProperty(property.Name).GetValue(value).GetHashCode()) 
      { 
       RaisePropertyChanged(property.Name); 
      } 
     } 

     movie = value; 

    } 
} 

sicher können Sie es außerhalb zu einem externen Helfer nehmen, die 2 Objekte und die Event-Handler nehmen