locked
MVVM Navigation entre les pages RRS feed

  • Question

  • Bonjour,

    Bon je vais faire mon petit Caliméro.

    Poufff j'ai l'impression qu'MVVM m'apporte (pour le moment) plus de problèmes de compréhension qu'autre chose. Tous est bloquant à mon stade. J'ai commencé une petite appli où le plus souvent on me répondait "à si tu étais en MVVM..." alors j'ai recommencé en MVVM mais c'est d'autres problèmes qui se posent.

    Je vais les prendre au Hackathon, peut être de vive voix on pourra m'expliquer..

    Avant derrière l'évènement SelectionChanged du ListBox, je mettais :

    string destination = "/MainPage.xaml";
    destination += String.Format("?type={0}", item.id);
    this.NavigationService.Navigate(new Uri(destination, UriKind.Relative));

    Mais là en MVVM je comprends que c'est plus pareil. Dans ma VueModel j'ai :

    public class ViewModel
        {
            public ObservableCollection<Figure> Figures { getset; }
     
            public DelegateCommand<Figure> MyCommand { getset; }
     
            public ViewModel()
            {
                this.MyCommand = new DelegateCommand<Figure>(SelectedItem);
            }
     
            void SelectedItem(Figure item)
            {
                MessageBox.Show("MySelectedItem"+item.ID);
                //string destination = "/MainPage.xaml";
                ////destination += String.Format("?type={0}", item.id);
                //this.NavigationService.Navigate(new Uri(destination, UriKind.Relative));
            }

    Je présume qu'il y a encore des class barbare pour faire une navigation après un click sur un item ?



    jeudi 22 mars 2012 13:56

Réponses

  • Bonjour,

    Tu viens de mettre le doit sur une point noir de MVVM: la navigation.

    Le navigation service fait partit de la classe de base PhoneApplicationPage.

    Personnellement pour naviguer, j'ai une classe static qui me permet d'acceder au navigation service de l'application frame (le conteneur des pages).

    //-----------------------------------------------------------------------
    // <copyright file="NavigationService.cs" company="Wygawm">
    //     Copyright (c) Wygwam. All rights reserved.
    // </copyright>
    // <author>Matthieu Narcisi</author>
    //-----------------------------------------------------------------------
    
    namespace Wyg.Phone.Services
    {
    	using System;
    	using System.Net;
    	using System.Windows;
    	using System.Windows.Controls;
    	using System.Windows.Documents;
    	using System.Windows.Ink;
    	using System.Windows.Input;
    	using System.Windows.Media;
    	using System.Windows.Media.Animation;
    	using System.Windows.Shapes;
    	using System.Collections.Generic;
    	using Microsoft.Phone.Controls;
    	using System.Text;
    
    	public static class NavigationService
    	{
            public static bool CanGoBack
            {
                get
                {
                    PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
                    if (frame == null)
                        return false;
    
                    return frame.CanGoBack;
                }
            }
    
            public static void GoBack()
            {
                PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
                if (frame == null)
                    return;
    
                frame.GoBack();
            }
    
            public static System.Windows.Navigation.JournalEntry RemoveBackEntry()
            {
                PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
                if (frame == null)
                    return null;
    
                return frame.RemoveBackEntry();
            }
    
    		public static void Navigate(string uri)
    		{
    			Navigate(uri, null);
    		}
    
    		public static void Navigate(string uri, IDictionary<string, string> parameters)
    		{
    			PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
    			if (frame == null)
    				return;
    
    			StringBuilder uriBuilder = new StringBuilder(uri);
    
    			if (parameters != null && parameters.Count > 0)
    			{
    				uriBuilder.Append("?"); 
    				bool prependAmp = false;
    				foreach (KeyValuePair<string, string> parameterPair in parameters)
    				{
    					if (prependAmp)
    						uriBuilder.Append("&");
    					uriBuilder.AppendFormat("{0}={1}", parameterPair.Key, parameterPair.Value);
    					prependAmp = true;
    				}
    			}
    			uri = uriBuilder.ToString();
    			frame.Navigate(new Uri(uri, UriKind.RelativeOrAbsolute));
    		}
    	}
    }
    N'hésite pas à l'utiliser toi aussi.

    jeudi 22 mars 2012 14:11

Toutes les réponses

  • Bonjour,

    Tu viens de mettre le doit sur une point noir de MVVM: la navigation.

    Le navigation service fait partit de la classe de base PhoneApplicationPage.

    Personnellement pour naviguer, j'ai une classe static qui me permet d'acceder au navigation service de l'application frame (le conteneur des pages).

    //-----------------------------------------------------------------------
    // <copyright file="NavigationService.cs" company="Wygawm">
    //     Copyright (c) Wygwam. All rights reserved.
    // </copyright>
    // <author>Matthieu Narcisi</author>
    //-----------------------------------------------------------------------
    
    namespace Wyg.Phone.Services
    {
    	using System;
    	using System.Net;
    	using System.Windows;
    	using System.Windows.Controls;
    	using System.Windows.Documents;
    	using System.Windows.Ink;
    	using System.Windows.Input;
    	using System.Windows.Media;
    	using System.Windows.Media.Animation;
    	using System.Windows.Shapes;
    	using System.Collections.Generic;
    	using Microsoft.Phone.Controls;
    	using System.Text;
    
    	public static class NavigationService
    	{
            public static bool CanGoBack
            {
                get
                {
                    PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
                    if (frame == null)
                        return false;
    
                    return frame.CanGoBack;
                }
            }
    
            public static void GoBack()
            {
                PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
                if (frame == null)
                    return;
    
                frame.GoBack();
            }
    
            public static System.Windows.Navigation.JournalEntry RemoveBackEntry()
            {
                PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
                if (frame == null)
                    return null;
    
                return frame.RemoveBackEntry();
            }
    
    		public static void Navigate(string uri)
    		{
    			Navigate(uri, null);
    		}
    
    		public static void Navigate(string uri, IDictionary<string, string> parameters)
    		{
    			PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
    			if (frame == null)
    				return;
    
    			StringBuilder uriBuilder = new StringBuilder(uri);
    
    			if (parameters != null && parameters.Count > 0)
    			{
    				uriBuilder.Append("?"); 
    				bool prependAmp = false;
    				foreach (KeyValuePair<string, string> parameterPair in parameters)
    				{
    					if (prependAmp)
    						uriBuilder.Append("&");
    					uriBuilder.AppendFormat("{0}={1}", parameterPair.Key, parameterPair.Value);
    					prependAmp = true;
    				}
    			}
    			uri = uriBuilder.ToString();
    			frame.Navigate(new Uri(uri, UriKind.RelativeOrAbsolute));
    		}
    	}
    }
    N'hésite pas à l'utiliser toi aussi.

    jeudi 22 mars 2012 14:11
  • Avé ! Merci c'est super pratique.

    (Bon, j'ai quand même l'impression que je tombe sur tous les points noirs du MVVM dès mon apprentissage.)

    jeudi 22 mars 2012 14:23