2017-06-01 1 views
0

J'utilise MVVM Light pour mon application et j'ai également implémenté le service INavigationService pour revenir en arrière/entre les pages.L'événement ViewModel se déclenche plusieurs fois

Ainsi, dans un scénario commun, il est comme ça

MainPage> Catégories> Rounds> DataPage.

Dans la DataPage, je demande d'extraire les résultats et en fonction du résultat renvoyé par le rappel, j'appelle la méthode .GoBack() pour sortir la page en cours de la pile et revenir à Rounds. Ce que j'ai remarqué, c'est que si je tape d'abord le DataPage et le .GoBack() est appelé, puis appuyez sur un autre tour, la méthode de rappel sera tiré deux fois, et si je reviens encore et encore trois fois, et continue comme ça. Cela signifie essentiellement que le .goBack() sera appelé à nouveau et la navigation sera foiré.

Je crois que cela a à voir avec le fait de ne pas nettoyer les VM précédentes, j'ai essayé de changer ce comportement avec la classe UnRegister/Register de SimpleIOC mais pas de chance.

+0

Sons comme vous brancher l'événement lorsque vous entrez, mais pas quand vous décrochement partir. Je supprimer le rappel de l'événement dans le rappel. – Slepz

+0

@Slepz J'essayais de le faire et l'ai fait d'une autre manière maintenant, vérifiez ma réponse proposée et dites-moi votre commentaire. –

Répondre

0

Dans la classe ViewModel

public void UnsubscribeFromCallBack() 
{ 
    this.event -= method; 
} 

Dans la page .xaml.cs

protected override void OnDisappearing() 
    { 
     base.OnDisappearing(); 
     PageViewModel vm = (this.BindingContext as PageViewModel); 
     vm.UnSubscribeFromCallback(); 
    } 
+0

Cela devrait fonctionner super – Slepz

+0

@Slepz en pensant au modèle mvvm, pensez-vous qu'il peut être écrit d'une manière plus efficace? –

+0

En supposant que vous réutilisiez ces viewmodels et vues, et sans en savoir plus sur le contexte, je dirais que c'est la meilleure façon. Vous pouvez également connecter l'événement dans le constructeur viewmodel et décrocher dans le destructeur. Ensuite, utilisez OnAppearing et OnDisappearing pour définir un indicateur d'ignorer ou non l'événement (si vous avez même besoin de l'ignorer) – Slepz