2010-10-06 4 views
0

J'ai une collection de viewModels (InputViewModel) dans un autre viewModel (ScenarioManager). Chaque InputviewModel possède une instance d'une classe (RestOfInput) qui contient des propriétés permettant d'augmenter OnPropertyChanged. lorsque l'une de ces propriétés change l'événement est assurée par cette méthode (en InputViewModel):Réaction OnPropertyChanged différente la première fois et la deuxième fois

 public void TestAfterChanges(object sender, PropertyChangedEventArgs e) 
     { 
      MessageBox.Show("not ref"); 
      bool isInTheList = false; 
      RestOfInput roi = sender as RestOfInput; 
      string prop = e.PropertyName; 

      if (prop!="NameFile") 
      { 
       Difference d = new Difference(); 
       d.Length = prop; 
       d.Value1 = reference.RoI.getValueByPropertyName(prop); 
       d.Value2 = roi.getValueByPropertyName(prop); 

       foreach (Difference diff in _ListOfDifferences) 
       { 
        if (diff.Length==prop) 
        { 
         if ((Math.Abs(d.Value2-d.Value1)>0.001*d.Value1)) 
         { 
          //replace by le new one 
          _ListOfDifferences.Insert(_ListOfDifferences.IndexOf(diff), d); 
          _ListOfDifferences.Remove(diff); 
         } 
         else 
         { 
          //if change make the field value equal to the ref then remove from difference list 
          _ListOfDifferences.Remove(diff); 
         } 
         isInTheList = true; 
        } 

       } 

       if ((Math.Abs(d.Value2 - d.Value1) > 0.001 * d.Value1) && isInTheList==false) 
       { 
        _ListOfDifferences.Add(d); 
       } 

      } 


     } 

cette méthode donne juste un résumé des différences entre ce cas particulier et le cas de référence.

Maintenant, si le cas de référence des changements que je dois mettre à jour tous les cas et l'événement est traité dans ScenarioManager:

public void refCaseChanging(object sender, PropertyChangedEventArgs e) 
    { 
     MessageBox.Show("ref"); 

     string propname = e.PropertyName;  
     foreach (InputViewModel item in _casesList) 
     { 
      if (item!=inpVM) 
      { 
       item.RoI.OnPropertyChanged(propname); 
      }     
     } 

    } 

inpVM est le cas de référence.

Ensuite, j'ai ce comportement: -si je change un champ dans un cas qui n'est pas le cas de référence: tout est ok. -si je change un champ particulier dans le cas de référence: la première fois, tout va bien. Mais la seconde fois, seuls le cas de référence et le premier cas (dans la collection) qui n'est pas le cas de référence sont mis à jour> C'est comme si la boucle foreach était cassée ..

Aucune explication.

Si le message n'est pas clair s'il vous plaît me dire (pas facile à expliquer;))

Répondre

1

Une exception pourrait expliquer que le traitement cesse (même si l'on attend qu'il serait pris et affiché somewehre).

Avez-vous essayé de demander à VS d'arrêter votre programme lorsqu'une exception est levée? (Si vous n'avez jamais fait cela auparavant, allez à Debug/Exceptions et cochez la case pour les exceptions CLR)

+0

Je pense que Timores est sur l'argent. Je peux voir une exception de référence nulle possible à item.RoI (ne supposez pas que passer par if (item! = InpVM) signifie que l'item n'est pas nul) et l'exception a été interceptée quelque part dans l'arbre d'exécution que vous ignoriez . +1 –

+0

Timores merci pour la réponse très utile: le problème est sur la boucle foreach de la première méthode. Puisque je modifie la Collection _ListOfDifference, la boucle ne peut pas se terminer. – Gerrrard

+0

Tri Q, non le test est juste parce que le cas de référence appartient à la collection, mais celui-ci ne peut pas être retiré. Bien que ce ne soit jamais nul.Merci – Gerrrard

Questions connexes