none
Navengado entre páginas usando el patrón MVVM RRS feed

  • Pregunta

  • Hola a todos, me surgen dudas de como implementar en MVVM la navegación entre páginas. He usado siempre el sistema NavigationService.Navigate del code-behind pero estoy adaptándome a MVVM y no sé exactamente como implementarlo.

     

    Saludos.
    sábado, 12 de noviembre de 2011 0:17

Respuestas

  • Hola Jorge
    en MVVM deberías usar algún tipo de patrón navegador para poder invocar vistas de una forma desacoplada. Te paso el NavigationController que uso en mis apps a ver que te parece:
        public class navController
        {
            //Singleton, solo puede existir una instancia de esta clase.
            static navController current;
            public static navController Current
            {
                get
                {
                    if (current == null)
                    {
                        current = new navController();
                    }
                    return current;
                }
            }
    
            /// <summary>
            /// Método a ejecutar con parámetros de navegación.
            /// </summary>
            Action<NavigationEventArgs> NavigationMethod;
    
            /// <summary>
            /// Constructor
            /// </summary>
            public navController()
            {
                registeredViews.Add("Start", new Uri(@"/MainPage.xaml", UriKind.Relative));
            }
    
            /// <summary>
            /// Guarda una relación Identificador <-> Uri
            /// </summary>
            static Dictionary<String, Uri> registeredViews = new Dictionary<String, Uri>();
    
            /// <summary>
            /// Navegar a un target, sin parámetros.
            /// </summary>
            /// <param name="navigationTarget"></param>
            public void NavigateTo(String navigationTarget)
            {
                PhoneApplicationFrame rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
                rootFrame.Navigate(registeredViews[navigationTarget]);
            }
    
            /// <summary>
            /// Navegar a un target, con parámetros Uri
            /// </summary>
            /// <param name="navigationTarget"></param>
            /// <param name="UrlParams"></param>
            public void NavigateTo(String navigationTarget, String UrlParams)
            {
                PhoneApplicationFrame rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
                String newUrl = String.Format(@"{0}?{1}", registeredViews[navigationTarget].ToString(), UrlParams);
                rootFrame.Navigate(new Uri(newUrl, UriKind.RelativeOrAbsolute));
            }
    
            /// <summary>
            /// Navegar a un target, con parámetros complejos.
            /// </summary>
            /// <param name="navigationTarget"></param>
            /// <param name="onNavigated"></param>
            public void NavigateTo(String navigationTarget, Action<NavigationEventArgs> onNavigated)
            {
                PhoneApplicationFrame rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
                rootFrame.Navigate(registeredViews[navigationTarget]);
                NavigationMethod = onNavigated;
                rootFrame.Navigated += new System.Windows.Navigation.NavigatedEventHandler(root_Navigated);
            }
    
            /// <summary>
            /// Este evento se lanza cuando hemos navegado a una página.
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void root_Navigated(object sender, NavigationEventArgs e)
            {
                if (NavigationMethod != null)
                {
                    NavigationMethod(e);
                    NavigationMethod = null;
                }
            }
        }
    

    Usarlo es muy sencillo, si lo miras con atención sobreescribe los posibles usos de NavigationService.Navigate.
    Espero que te ayude. Un saludo!
     

    MCTS - .NET 4.0 Windows Applications
    MCTS - .NET 4.0 Data Access
    MCTS - .NET 4.0 Service Communication Applications
    MCPD - .NET 4.0 Windows Developer
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    • Marcado como respuesta Jorge AR jueves, 15 de diciembre de 2011 13:51
    lunes, 21 de noviembre de 2011 6:22
    Moderador

Todas las respuestas

  • Hola Jorge
    en MVVM deberías usar algún tipo de patrón navegador para poder invocar vistas de una forma desacoplada. Te paso el NavigationController que uso en mis apps a ver que te parece:
        public class navController
        {
            //Singleton, solo puede existir una instancia de esta clase.
            static navController current;
            public static navController Current
            {
                get
                {
                    if (current == null)
                    {
                        current = new navController();
                    }
                    return current;
                }
            }
    
            /// <summary>
            /// Método a ejecutar con parámetros de navegación.
            /// </summary>
            Action<NavigationEventArgs> NavigationMethod;
    
            /// <summary>
            /// Constructor
            /// </summary>
            public navController()
            {
                registeredViews.Add("Start", new Uri(@"/MainPage.xaml", UriKind.Relative));
            }
    
            /// <summary>
            /// Guarda una relación Identificador <-> Uri
            /// </summary>
            static Dictionary<String, Uri> registeredViews = new Dictionary<String, Uri>();
    
            /// <summary>
            /// Navegar a un target, sin parámetros.
            /// </summary>
            /// <param name="navigationTarget"></param>
            public void NavigateTo(String navigationTarget)
            {
                PhoneApplicationFrame rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
                rootFrame.Navigate(registeredViews[navigationTarget]);
            }
    
            /// <summary>
            /// Navegar a un target, con parámetros Uri
            /// </summary>
            /// <param name="navigationTarget"></param>
            /// <param name="UrlParams"></param>
            public void NavigateTo(String navigationTarget, String UrlParams)
            {
                PhoneApplicationFrame rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
                String newUrl = String.Format(@"{0}?{1}", registeredViews[navigationTarget].ToString(), UrlParams);
                rootFrame.Navigate(new Uri(newUrl, UriKind.RelativeOrAbsolute));
            }
    
            /// <summary>
            /// Navegar a un target, con parámetros complejos.
            /// </summary>
            /// <param name="navigationTarget"></param>
            /// <param name="onNavigated"></param>
            public void NavigateTo(String navigationTarget, Action<NavigationEventArgs> onNavigated)
            {
                PhoneApplicationFrame rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
                rootFrame.Navigate(registeredViews[navigationTarget]);
                NavigationMethod = onNavigated;
                rootFrame.Navigated += new System.Windows.Navigation.NavigatedEventHandler(root_Navigated);
            }
    
            /// <summary>
            /// Este evento se lanza cuando hemos navegado a una página.
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void root_Navigated(object sender, NavigationEventArgs e)
            {
                if (NavigationMethod != null)
                {
                    NavigationMethod(e);
                    NavigationMethod = null;
                }
            }
        }
    

    Usarlo es muy sencillo, si lo miras con atención sobreescribe los posibles usos de NavigationService.Navigate.
    Espero que te ayude. Un saludo!
     

    MCTS - .NET 4.0 Windows Applications
    MCTS - .NET 4.0 Data Access
    MCTS - .NET 4.0 Service Communication Applications
    MCPD - .NET 4.0 Windows Developer
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    • Marcado como respuesta Jorge AR jueves, 15 de diciembre de 2011 13:51
    lunes, 21 de noviembre de 2011 6:22
    Moderador
  • Josue, ya se como utilizar el patrón que me has puesto, que por cierta, también está explicado en tú libro.

    Primero registrando las URI en el diccionario y luego usando NavigateTo.

    Una duda que me surge, ¿cómo implemento el goBack();?

    Creo que ya lo solucioné con:

            public void GoBack()
            {
                PhoneApplicationFrame rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
                if (rootFrame.CanGoBack)
                {
                    rootFrame.GoBack();
                }
            }

    Espero que no explote, :)

    Gracias.



    • Editado Jorge AR jueves, 15 de diciembre de 2011 13:51
    jueves, 15 de diciembre de 2011 13:42
  • Hola Jorge!

    Primero mil disculpas, estoy hasta arriba de trabajo y no he podido contestarte antes.

    El GoBack se realiza automáticamente con la tecla atrás del teléfono. Si quieres controlar de alguna forma cuando el usuario la ha presionado, deberías sobreescribir el método OnBackKeyPress de la página directamente.

    Un saludo!


    MCTS - .NET 4.0 Windows Applications
    MCTS - .NET 4.0 Data Access
    MCTS - .NET 4.0 Service Communication Applications
    MCPD - .NET 4.0 Windows Developer
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    jueves, 15 de diciembre de 2011 13:45
    Moderador