WP7 Navigazione MVVM

Ho cercato diversi modi per gestire la navigazione sulle applicazioni Windows Phone, usando però il pattern MVVM.

Finalmente penso di aver trovato una soluzione ottimale, prendendo spunto da questo blog

http://www.joshclose.net/2011/11/navigation-with-mvvm-on-wp7/

ed evolvendolo sfruttando la nuova versione (ancora in Beta,ma già molto stabile) di MVVMLight.

L’idea è che ogni schermata della nostra applicazione sia di tipo “PageBase”, ed ogni schermata abbia un ViewModel associato di tipo MyViewModelBase. Rispetto all’esempio del Blog di Josh, ho aggiunto nel ViewModel un comando per la navigazione ad una pagina (specificata nel CommandParameter)

        private void ExecuteNavigateToCommand(object param)
        {
            NavigationService.Navigate(new System.Uri(param.ToString(), System.UriKind.RelativeOrAbsolute));
        }

        private RelayCommand<string> _NavigateToCommand;
        public RelayCommand<string> NavigateToCommand
        {
            get
            {
                return _NavigateToCommand
                    ?? (_NavigateToCommand = new RelayCommand<string>(ExecuteNavigateToCommand));
            }
        }

 

e un comando per navigare indietro:

        private void ExecuteNavigateBack()
        {
            NavigationService.GoBack();
        }
        private RelayCommand _navigateBackCommand;
        public RelayCommand NavigateBackCommand
        {
            get
            {
                return _navigateBackCommand
                    ?? (_navigateBackCommand = new RelayCommand(
                                          () =>
                                          {
                                              ExecuteNavigateBack();
                                          }));
            }
        }

In questo modo, possiamo gestire la navigazione direttamente dallo xaml scrivendo:

    <Button Command="{Binding NavigateToCommand}" VerticalAlignment="Bottom" Grid.Row="0"
                    CommandParameter="/Pages/Page1.xaml"
                    Content="Page 1" />

Molto comodo il metodo virtual di MyViewModelbase che permette di ricevere direttamente sul ViewModel, la notifica di navigazione sulla pagina.

   public override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            MessageBox.Show("MessageBox dal VM sul NavigatedTo");
        }

L’associazione della pagina al ViewModel avviene tramite “ViewModelLocator” di MVVMLight, il che permette di dare uno stile alla nostra applicazione utilizzando Expression Blend. Ma, mi impegno a dedicare un prossimo post a questo argomento! Sorriso

Ed ecco a voi il sorgente.

(Thanks Charles for the courtesy – Grazie a Charles per avermi permesso di pubblicarlo!)

Lascia un Commento

Fill in your details below or click an icon to log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Log Out / Modifica )

Foto Twitter

You are commenting using your Twitter account. Log Out / Modifica )

Foto di Facebook

You are commenting using your Facebook account. Log Out / Modifica )

Connecting to %s

Iscriviti

Get every new post delivered to your Inbox.