J'essaie de trouver un moyen pour mon ViewModel pour gérer la sauvegarde ou la restauration de l'état de la page lorsque la page est navigua De ou.
La première chose que j'ai essayé était d'ajouter un comportement EventToCommand à la page, mais les événements (OnNavigatedFrom et OnNavigatedTo) sont déclarées protégées et la EventToCommand ne voit pas les événements pour se lier à. p>
Ensuite, je pensais que je voudrais essayer d'utiliser la classe Messenger pour passer un message au ViewModel en utilisant le code dans la Code de vue derrière: p>
Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedFrom", false, (action) => SaveState(action)); Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedTo", false, (action) => RestoreState(action));
5 Réponses :
On dirait que vous avez déjà une solution à votre problème. Je suggère également ce qui suit:
Recherchez à l'aide de l'une des valeurs de message fournies dans la boîte à outils MVVM, telle que: p> comme ceci: p>
Exécution d'une commande du code derrière est beaucoup plus propre que de traverser tout le désordre de messagerie. Après tout, il n'y a rien de mal à connaître son DataContext.
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); viewModel.NavigatedToCommand.Execute(e.Uri); } ProfileViewModel viewModel { get { return this.DataContext as ProfileViewModel; } }
Je ne suis pas contre avec la lumière MVVM. Je pense juste à son temps d'exécution. Aller de la vue à viewModel via ViewModellocator
Je pense que ce que Ryan commençait, était le fait que vous utilisiez le phonapplicationPage comme message envoyé, au lieu d'un message réel.
Vous faites ceci: P>
Messenger.Default.Send<NavigatingToMessage>(new NavigatingToMessage());
Désolé d'avoir trois ans de retard à cette question. Oui, j'utilise toujours Silverlight. Ok je veux l'écrire dans J'utilise une méthode d'extension, comme ceci: P> page code> code-derrière comme ceci:
using System.Windows.Navigation;
namespace Fox.Silverlight.ViewModels
{
/// <summary>
/// Defines View Model members for frame-navigation pages.
/// </summary>
public interface IPageNavigationViewModel
{
/// <summary>
/// Handles the <see cref="Page.OnNavigatedTo"/> method in the View Model.
/// </summary>
/// <param name="e">The <see cref="NavigationEventArgs"/> instance containing the event data.</param>
void HandleOnNavigatedTo(NavigationEventArgs e);
/// <summary>
/// Handles the <see cref="Page.OnNavigatedFrom"/> method in the View Model.
/// </summary>
/// <param name="e">The <see cref="NavigationEventArgs"/> instance containing the event data.</param>
void HandleOnNavigatedFrom(NavigationEventArgs e);
}
}
Je fais un échantillon à l'aide de la réponse mise à jour à l'intérieur de la question suivante:
MainviewModel.xaml.cs: p> MainviewModel.xaml.cs: p> < Pré> xxx pré> p>