2017-10-10 14 views
0

J'utilise MvvmCross 4.2.3 et j'ai une question sur le moment où il est sûr d'appeler ShowViewModelMvvmCross ShowViewModel à partir de début()

Je suis en train d'appeler ShowViewModel pour naviguer dans la méthode Début de ViewModelA pour naviguer à ViewModelB, mais je reçois l'exception suivante

Java.Lang.IllegalStateException: Recursive entry to executePendingTransactions 

Je suppose que je faisais trop tôt dans le cycle de vie viewA \ ViewModelA. J'ai donc mis l'appel dans le OnResume de ViewA. J'ai supposé à ce stade que toutes les transactions nécessaires pour montrer ViewA auraient été engagées.

Mais j'ai toujours la même erreur.

Quelqu'un at-il rencontré ce problème. Si oui, comment puis-je le résoudre.

Merci à l'avance

Répondre

0

Je ne suis pas spécifique ici, juste essayer de résoudre ce que vous avez demandé.

Je pense qu'il pourrait y avoir deux scénarios.

scenerio d'abord. vous voulez naviguer sur l'interaction de l'utilisateur permet de dire en appuyant sur un bouton.

Dans la vue interne, vous pouvez placer ce code dans les substitutions de méthode OnCreate ou ViewModelSet.

var set = this.CreateBindingSet<MyView, MyViewModel>(); 
set.Bind(MyButton).For(zz => zz.BindClick()).To(vm => vm.MyCommand); 

À l'intérieur de votre viewmodel, vous en auriez besoin.

 private ICommand myCommand; 
    public virtual ICommand MyCommand 
    { 
     get 
     { 
      return myCommand = myCommand ?? new MvxCommand(() => { 
       Task.Factory.StartNew(() => { 
        ShowViewModel<MyNextViewModel>(); 
       }); 
      }); 
     } 
    } 

Scénario 2,

Vous avez une tâche Async se passe en fonction à la fin de ce que vous voulez naviguer. À l'intérieur de votre constructeur viewmodel, vous appelez une méthode comme ci-dessous:

Public MyViewModel(){ 
LoadActivation() 
} 

private async void LoadActivation() 
{ 
await Task.Run(async() => 
    { 
try { 
    response = await _Myservice.LoadMyData(); 
    if(response != null) { 
     ShowViewModel<MyNextViewModel>(): 
    } 
    } 
    catch (Exception ex) { 
    Debug.WriteLine(ex); 
} 
       }); 
    }