2010-03-11 4 views
7

Je suis un scénario comme celui-ciautomatiquement mis en place PropertyChanged lorsqu'une propriété d'objet intérieur ont été changés

Class Parent 
{ 
    Property A; 
} 

Class A 
{ 
     Property X 
} 

Comment puis-je obtenir un PropertyChangedNotification sur la propriété A quand Changements X? Je ne veux pas faire référence à «Parent» dans la classe A ou à tout type d'événement qui gâte mon découplage. Ce que je veux essentiellement, c'est faire le Parent.IsDirty==true. C'est une version très simplifiée de mon histoire, j'ai des dizaines de classes comme Parent, donc je cherche une façon générique de gérer ça.

Veuillez noter qu'il ne s'agit pas du code actuel. J'ai eu toutes les implémentations INotifyPropertyChanged. Je me demande juste un mécanisme facile comme RaisePropertyChanged("A.X")

Répondre

8

Vous pouvez essayer d'enregistrer l'événement propertychanged dans la classe parente. Dans le constructeur, vous pouvez subribe à l'événement:

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

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

espérons que cette aide ...

+0

Je choisis cette réponse, mais je me sens modèle de messager MVVM est ce que je cherche. –

+0

@RoelF cela fonctionne-t-il toujours dans> = .Net 4.0? – Thomas

+0

@Thomas Je ne vois pas pourquoi il ne serait pas réellement ... – RoelF

0

Je ne sais pas si cela est la meilleure pratique, mais: ce que quelque chose comme ceci:

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; 

    } 
} 

sûrement vous pouvez le prendre à l'extérieur à une aide externe qui prennent les 2 objets et le gestionnaire d'événements

Questions connexes