Ho letto parecchi blog/post che chiedevano come gestire nel migliore dei modi la navigazione in Silverlight3 usando Model-View-ViewModel.
Inizialmente sono rimasto un po’ disorientato in quanto abituato ad usare il metodo Navigate esposto da NavigationService e questo in qualche modo implicava la conoscenza di quest’ultimo nel Viewmodel oppure il comunicare via EventAggregator/Mediator/ServiceLocator la richiesta di navigazione verso la View.
In realtà ho verificato che la soluzione, almeno quella relativa alla sola navigazione, è molto più semplice e consiste nel fare esporre al ViewModel la pagina da navigare e bindarla alla proprietà Source dell’ oggetto Frame.
Esempio:

   1: <navigation:Frame Grid.Row="1" Source="{Binding CurrentPage}">            
   2:             <navigation:Frame.UriMapper>
   3:                 <uriMapper:UriMapper>
   4:                     <uriMapper:UriMapping MappedUri="/Page1.xaml"
   5:                                           Uri="/P1" />
   6:                     <uriMapper:UriMapping MappedUri="/Page2.xaml"
   7:                                           Uri="/P2" />
   8:                 </uriMapper:UriMapper>
   9:             </navigation:Frame.UriMapper>
  10:         </navigation:Frame>

ViewModel:

   1: public class ShellViewModel : INotifyPropertyChanged
   2: {
   3:     private Uri currentPage;
   4:  
   5:     public Uri CurrentPage
   6:     {
   7:         get { return currentPage; }
   8:         set
   9:         { 
  10:             currentPage = value;
  11:             this.OnPropertyChanged(MethodBase.GetCurrentMethod().Name.Remove(0, 4));
  12:         }
  13:     }
  14:  
  15:  
  16:     public void NavigateTo(string uri)
  17:     {
  18:         this.CurrentPage = new Uri(uri, UriKind.Relative);
  19:     }
  20:  
  21:     ...
  22: }

A questo punto basta passare la uri al  metodo NavigateTo per far navigare il frame verso la pagina desiderata con la relativa integrazione nel browser, il tutto funziona anche se al frame è associato un oggetto UriMapper.

Technorati Tags: ,