10
votes

Manipulation de l'ONNavigatedfrom / OnnavigateDe Événements dans la viewModel

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));


0 commentaires

5 Réponses :


1
votes

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: xxx

comme ceci: xxx


0 commentaires

5
votes

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;
        }
    }


1 commentaires

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



0
votes

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());


0 commentaires

3
votes

Désolé d'avoir trois ans de retard à cette question. Oui, j'utilise toujours Silverlight. Ok je veux l'écrire dans page code> code-derrière comme ceci: xxx pré>

J'utilise une méthode d'extension, comme ceci: P>

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);
    }
}


0 commentaires

0
votes

Je fais un échantillon à l'aide de la réponse mise à jour à l'intérieur de la question suivante:

MainviewModel.xaml.cs: xxx

MainviewModel.xaml.cs: < Pré> xxx


0 commentaires