2016-06-10 17 views
0

Ich entwickle Win 8.1-Anwendung mit MvvmCross 3.5.1. Der Benutzer durchläuft die verschiedenen Ansichten sequenziell und kehrt von der letzten Ansicht zur ersten Ansicht zurück. Alles funktioniert perfekt während der ersten Iteration des Workflows. Wenn der Benutzer den Arbeitsablauf jedoch erneut startet, werden Init() - Methoden in Viewmodels nicht aufgerufen.Warum Init() -Methode wird nicht aufgerufen, wenn ich zum zweiten Mal zum ViewModel navigiere?

Zum Beispiel sieht die Interaktion zwischen FirstViewModel und SecondViewModel wie folgt aus.

FirstViewModel:

ShowViewModel<SecondViewModel>(
    new 
    { 
     code = ItemCode, 
     descr = ItemDescription 
    }); 

SecondViewModel:

public void Init(string code, string descr) 
{ 
    ... 
} 

So einfach funktioniert aber nur einmal :(

Welche Gründe ein solches Verhalten zur Folge haben kann


Wie w orkaround Ich habe versucht, laden Ansichtsmodell "von Hand":

var d = new Dictionary<string, string> 
{ 
    {"code", ItemCode}, 
    {"descr", ItemDescription} 
}; 

var b = new MvxBundle(d); 

var r = new MvxViewModelRequest<SecondViewModel>(b, null, null); 

var m = Mvx.Resolve<IMvxViewModelLoader>().LoadViewModel(r, null); 

Es löste das Problem mit Init (Aufruf von Methoden). Aber ich weiß nicht, wie man das Viewmodel mit der Variablen m zeigt. Jeder weiß es?


Entschuldigung für mein schlechtes Englisch und danke im Voraus!

+0

Ich weiß nicht, über mvvmcross, aber ich würde denken, dass Sie für die „Load“ Methode suchen oder „Loaded " Veranstaltung. – Kilazur

+0

Wahrscheinlich, es sei denn, Sie löschen explizit die Ansicht, die sie initialisiert und beim Zurückgeben aus dem Speicher zurückgezogen hat, und werden nicht erneut initialisiert. –

+0

Dieser Beitrag könnte Sie interessieren: http://stackoverflow.com/questions/17857543/mvvmcross-viewmodel-caching-and-re-initializing – momar

Antwort

1

Init() wird nur einmal aufgerufen, da Windows 8.1-Anwendungen Seiten zwischenspeichern. Daher wird das ViewModel für diese Seite nicht zerstört und daher wird die Methode Init() nicht erneut aufgerufen.

Sie können Ihre eigenen Basepage machen, die dieses Verhalten außer Kraft gesetzt durch zwingende OnNavigatedTo:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    if (e.NavigationMode == NavigationMode.New) 
     ViewModel = null; 

    base.OnNavigatedTo(e); 
} 
+1

Zeile 4 des Codebeispiels muss mit einem Semikolon enden. Die Antwort kann nicht bearbeitet werden, da Änderungen mindestens 6 Zeichen lang sein müssen. –

+0

Danke Cheesebaron! Es hat mein Problem gelöst. Ich fing jetzt an, andere Arten von Fehlern zu bekommen, aber das Hauptproblem mit Init() wurde behoben. –