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;))
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 –
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
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