Gestion des événements OnNavigatedFrom / OnNavigatedTo dans le ViewModel
Je suis en train d'essayer de trouver un moyen pour mon ViewModel pour gérer la sauvegarde ou la restauration de la page de l'état lorsque la page est accédée à Partir de ou À.
La première chose que j'ai essayé était d'ajouter une EventToCommand comportement à la page, mais les événements (OnNavigatedFrom et OnNavigatedTo) sont déclarées protégées et la EventToCommand ne pas voir les événements à lier à.
Ensuite, j'ai pensé que je voudrais essayer à l'aide de la classe Messenger pour passer un message à ce Dernier à l'aide de code dans la Vue de code derrière:
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
Messenger.Default.Send<PhoneApplicationPage>(this);
base.OnNavigatedFrom(e);
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
Messenger.Default.Send<PhoneApplicationPage>(this);
base.OnNavigatedTo(e);
}
Mais cela semble avoir deux questions, la première est d'avoir ce code dans le code-behind de la page. Deuxièmement, le ViewModel ne peut pas faire la différence entre le OnNavigatedFrom et OnNavigatedTo des événements sans avoir à créer un jeu à l'une des classes wrapper pour la PhoneApplicationPage objet (voir la mise à JOUR ci-dessous).
Ce qui est le plus MVVM-Lumière de manière conviviale pour gérer ces événements?
Mise à JOUR:
J'ai été en mesure de résoudre le deuxième problème en Envoyant les Messages comme ceci:
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
Messenger.Default.Send<PhoneApplicationPage>(this,"NavigatedFrom");
base.OnNavigatedFrom(e);
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
Messenger.Default.Send<PhoneApplicationPage>(this, "NavigatedTo");
base.OnNavigatedTo(e);
}
et de les Enregistrer comme ceci:
Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedFrom", false, (action) => SaveState(action));
Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedTo", false, (action) => RestoreState(action));
source d'informationauteur Jeff R | 2010-07-27
Vous devez vous connecter pour publier un commentaire.
L'exécution d'une commande de code derrière est bien plus propre que de passer par l'ensemble de la messagerie mess. Après tout, il n'y a rien de mal avec le point de vue de connaître son DataContext.
Mise à jour: Passant NavigationContext.QueryString est probablement plus utile, puisqu'il analyse les paramètres et la valeur.
Désolé pour trois ans de retard à cette question. Oui, je suis toujours à l'aide de Silverlight. Bon j'ai envie de l'écrire dans
Page
code-behind comme ceci:Je suis en utilisant une méthode d'extension comme ceci:
La méthode d'extension implique que le
Page
doit avoir un Modèle de Vue qui met en œuvre IPageNavigationViewModel dansDataContext
. Pour moi, c'est une séparation des préoccupations de compromis où la Page ne connaît que sur les plus polyvalents types de données dans le Domaine. Cette interface:Semble que vous avez une solution à votre problème déjà. Je voudrais aussi vous suggère de:
Oeil à l'aide de l'un des messages les valeurs fournies dans le mvvm-boîte à outils, tels que:
Comme ceci:
Je pense que ce que Ryan a été, a été le fait que vous êtes à l'aide de la PhoneApplicationPage que le message qui est envoyé, au lieu d'un message réel.
Vous êtes en train de faire ceci:
qui est de l'envoi d'un message de type PhoneApplicationPage. Vous n'avez probablement pas besoin d'envoyer l'ensemble de PhoneApplicationPage que le message.
Vous pourriez faire quelques messages pour NavigatingTo /NavigatingFrom, c'est à dire.
etc.
Je suis sûr qu'il y a un million de meilleures façons de le faire, je me contentais de ce que vous avait mis les choses en place. Personnellement, ma classe ViewModelBase a NavigatingTo/NavigatingFrom méthodes et je remplace les méthodes respectives de la Vue et de les envoyer à mon ViewModel.
- Je faire un échantillon en utilisant la mise à jour de la réponse à l'intérieur de la question :
MainViewModel.xaml.cs :
MainViewModel.xaml.cs :