2017-06-26 5 views
3

ich eine Frage über die Navigation Service haben eingeführt in MvvmCross 5.Fragment Initialisierungsreihenfolge in MvvmCross 5 Navigation Service

In Version 4:

  • ich navigieren mit ShowViewModel<ViewModel>() zu einem Fragment
  • dann Init Methode des ViewModel heißt
  • danach wird die OnCreateView Methode des Fragments
  • genannt
  • Dort kann ich die Ansicht basierend auf ViewModel-Daten bearbeiten (z. B. bestimmte Elemente zur Ansicht hinzufügen).

In Version 5:

  • ich navigieren mit await NavigationService.Navigate<ViewModel>()
  • die OnCreateView des Fragment ersten
  • danach die Initialize Methode aus dem Ansichtsmodell genannt wird.
  • Dies beendet keine ViewModel-Daten beim Erstellen der Fragmentansicht.

Ist dies ein Fehler oder eine Funktion der asynchronen Navigation? Wenn das so gewünscht wird, gibt es eine bessere Möglichkeit, die Fragment-Ansicht basierend auf ViewModel-Daten zu manipulieren?

+0

können Sie die Methode "void OnViewModelSet()" verwenden, die in der Ansicht überschrieben werden kann. – hugoterelle

+0

Danke, aber die 'OnViewModelSet' Methode wird leider vor den' OnCreateView' und 'Initialize' Methoden aufgerufen – nasibu

Antwort

2

Ist dies ein Fehler oder eine Funktion der asynchronen Navigation?

Es war von Entwurf, aber seit (v5.0.4) wurde überarbeitet, siehe unten Strömungsänderungen.

Wenn das so gewollt ist, gibt es eine bessere Möglichkeit, das Fragment View basierend auf ViewModel-Daten zu manipulieren?

Die Verwendung von v5.0.4 + sollte das gewünschte Verhalten ergeben, das Sie erwarten. Wo der Navigationsdienst auf Initialize() Ihres ViewModel erwartet wird, um zu vervollständigen, bevor die Lebenszyklusereignisse der Ansichten gestartet werden.


MvvmCross v5.0.0 - v5.0.3

Das Verhalten Sie war in MvvmCross 5.0.0-5.0.3 vorhanden sehen.Der Fluss war wie folgt:

  • ViewModel.Ctor
  • (Ausgewählte Navigation nennt)Init(parameter)( veraltet, verwendet Reflektion, sondern typsicher initialisieren verwenden)
  • (Selected Navigieren Anrufe)ViewModel.ReloadState(savedState)
  • (Ausgewählte Anrufe navigieren)ViewModel.Start()
  • BeforeNavigate(Navigation Ereignis)
  • *ViewDispatcher.ShowViewModel()(Triggers anzuzeigen Lebenszyklen)
  • *ViewModel.Initialize()
  • AfterNavigate(Navigation Ereignis)
  • BeforeClose(NavigationServic e Ereignis)
  • ViewDispatcher.ChangePresentation()
  • AfterClose(Navigation Ereignis)

MvvmCross v5.0.4 +

v5.0.4+ hat die Strömung verbessert und verändert die Navigationsreihenfolge:

  • ViewModel.Ctor
  • BeforeNavigate(Navigation Ereignis)
  • *ViewModel.Initialize()
  • Init(parameter)(veraltet verwendet Reflexion, sondern verwenden type safe Initialize)
  • ViewModel.ReloadState(savedState)
  • ViewModel.Start()
  • *ViewDispatcher.ShowViewModel()(Triggers anzuzeigen Lebenszyklen)
  • AfterNavigate(Navigation Ereignis)
  • BeforeClose(Navigation Ereignis)
  • ViewDispatcher.ChangePresentation()
  • AfterClose(Navigation Ereignis)

Weitere Informationen

Sie können die GitHub Ausgabe check out (#1968) um die Navigation angemeldet. Darüber hinaus können Sie die Pull-Anforderung (#1971) auschecken, die die Initialize Bestellung für Version 5.0.4 aktualisiert.

+0

Vielen Dank für die ausführliche Antwort! Ich hatte bereits 5.0.5 installiert. Die neue Bestellung wurde jedoch erst nach Reinigung der Lösung übernommen. Meine Schuld:/ – nasibu

+1

Dies wird sich in https://github.com/MvvmCross/MvvmCross/pull/2072 auf MvvmCross 5.2.0 erneut ändern. Aus diesem Grund haben wir ShowViewModel verlassen, damit wir den NavigationService in den folgenden Releases stabilisieren können. – Martijn00

Verwandte Themen