2010-04-23 3 views
1

j'ai une classe appelée DataStore et une liste des Department s (un ObservableCollection), et chaque ministère a de nouveau une liste de Product s. Les propriétés de la classe Product modifiées affectent également les propriétés des classes Department et DataStore. Comment chaque Product notifier le Department auquel il appartient, et le DataStore (qui est la classe mère de tous) qu'une ou plusieurs de ses propriétés ont changé leurs valeurs? Exemple: un produit a la propriété NumberSoldToday et est lié. Le Ministère a une propriété appelée TotalNumberOfProductsSold:Firing événement PropertyChanged dans un type complexe, niché dans WPF

public int TotalNumberOfProductsSold 
{ 
    get 
    { 
    int result = 0; 
    foreach(Product p in this.products) 
     result += p.NumberSoldToday; 
    return result; 
    } 
} 

Et le magasin de données a une TotalProductsSold de propriété (pour tous les départements):

public int TotalProductsSold 
{ 
    get 
    { 
    int result = 0; 
    foreach(Product p in this.deparments) 
     result += p.TotalNumberOfProductsSold; 
    return result; 
    } 
} 

Si toutes ces propriétés sont liées, et les changements de propriété les plus intimes, il doit en quelque sorte notifier que la valeur des deux autres a également changé. Comment? La seule façon dont je peux voir cela se produire est de raccorder l'événement PropertyChanged dans chaque classe. L'événement Th doit également déclencher lors de la suppression, en ajoutant à la collection de produits et de départements, respectivement.

Existe-t-il une meilleure façon de faire cela?

Répondre

1

Plutôt que de calculer la valeur à chaque fois que cela vous est demandé, vous pouvez définir la valeur chaque fois que quelque chose qui devrait l'affecter change. Dans ce cas, vous souhaitez gérer l'événement this.deparments.CollectionChanged et y effectuer votre calcul. La propriété TotalProductsSold ressemblerait à n'importe quelle autre propriété, avec un appel FireNotifyPropertyChanged("TotalProductsSold") dans son setter ...

+0

Je vois. Pour en revenir à mon exemple ci-dessus, disons que je m'abonne à l'événement CollectionChanged dans le département. Cet événement est-il déclenché lorsqu'une propriété de l'un des éléments de la collection (= Produit) change? Cet événement n'est pas seulement pour ajouter/supprimer/déplacer? – John

+0

@John - CollectionChanged ne se déclenche pas lorsqu'un objet contenu dans la collection a une de ses propriétés modifiée. Pour ce faire, vous devez vous abonner à leurs événements PropertyChanged individuels. Vous pouvez connecter ces événements lorsque des éléments sont ajoutés ou supprimés de la collection. – jpierson

Questions connexes