locked
Навигация в Windows Phone 7 с применением MVVM RRS feed

  • Вопрос

  • Привет, Друзья!

    Подскажите кто знает, как организовать навигацию в WP7 между страницами с применением mvvm. Хотелось бы вызывать метод Navigate класса NavigationService, но как это сделать? NavigationService не доступен во ViewModel.

    Сейчас я передаю во ViewModel ссылку на View и работаю с NavigationService этого представления. Но так не правильно, потому что ViewModel не должна ничего знать о View.

    Подскажите, как сделать правильную навигацию и гармонично вписаться в MVVM?

    Вот мой код:

     

     public class MainMenuViewModel: INotifyPropertyChanged
     {
      private readonly MainMenuView _navigationService;
    
      public MainMenuViewModel(object navigationService)
      {
       if (navigationService != null)
       {
        _navigationService = (MainMenuView)navigationService;
       }
       else
       {
        return;
       }
    
       CategoryList = new ObservableCollection<CategoryModel>();
       CategoryList.Add(new CategoryModel{Name = "Test1"});
       CategoryList.Add(new CategoryModel { Name = "Test2" });
       CategoryList.Add(new CategoryModel { Name = "Test3" });
    
       this.NavigateCommand = new DelegateCommand<object>(this.Navigate, this.CanNavigate);
      }
    
      #region NavigateCommand
    
      public ICommand NavigateCommand { get; set; }
    
      private void Navigate (object obj)
      {
       _navigationService.NavigationService.Navigate(new Uri("/Views/Page1.xaml", UriKind.RelativeOrAbsolute));
      }
    
      private bool CanNavigate(object obj)
      {
       return true;
      }
    
      #endregion
    
    
      #region Fields
    
      private ObservableCollection<CategoryModel> _categoryList;
      public ObservableCollection<CategoryModel> CategoryList
      {
       get { return _categoryList; }
       set
       {
        _categoryList = value;
        NotifyPropertyChanged("CategoryList");
    
       }
      }
    
      #endregion
    
      #region INotifyPropertyChanged
    
      public event PropertyChangedEventHandler PropertyChanged;
    
      public void NotifyPropertyChanged(string PropertyName)
      {
       if (PropertyChanged != null)
       {
        PropertyChanged(this,new PropertyChangedEventArgs(PropertyName));
       }
      }
    
      #endregion
    

     


    13 августа 2011 г. 17:19

Ответы

  • Как один из вариантов - создать сервис ViewsService, у которого будут различные методы вроде - ShowCategoryDetails. ViewsService нужно инициализировать NavigationService-ом и инъектить во ViewModel (например через конструктор). Тогда вроде бы и ViewModel не будет знать ничего о View, и будет вполне определенный механизм, через который будет осуществляться навигация с помощью ViewModel. Через этот же сервис можно осуществлять и какие-то колбеки от ассинхронных операций.

     

    Второй вариант, которым я пользовался только для кнопки Exit, заключается в том, чтобы бросать события различные из ViewModel. Будет что-то вроде CategoriesViewModel.OnShowCategoryDetails ивент, на который View будет подписываться и по нему что-то показывать. Тут тоже ViewModel не будет знать ничего о View и при этом этот же ивент можно вызывать в любой момент у ViewModel. Минус такого подхода - за навигацию будет отвечать конкретная вьюшка. Можно правда эту подписку сделать на уровне Application-а, но в итоге получится, что он будет выступать в качестве ViewsService-а. Это в общем-то тоже не плохо, но возможно есть что-нибудь получше.

    • Предложено в качестве ответа PetrishkoMVP 23 августа 2011 г. 20:30
    • Помечено в качестве ответа PetrishkoMVP 25 августа 2011 г. 5:20
    19 августа 2011 г. 7:47

Все ответы

  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме

    18 августа 2011 г. 9:40
  • вопрос актуален
    18 августа 2011 г. 10:19
  • Как один из вариантов - создать сервис ViewsService, у которого будут различные методы вроде - ShowCategoryDetails. ViewsService нужно инициализировать NavigationService-ом и инъектить во ViewModel (например через конструктор). Тогда вроде бы и ViewModel не будет знать ничего о View, и будет вполне определенный механизм, через который будет осуществляться навигация с помощью ViewModel. Через этот же сервис можно осуществлять и какие-то колбеки от ассинхронных операций.

     

    Второй вариант, которым я пользовался только для кнопки Exit, заключается в том, чтобы бросать события различные из ViewModel. Будет что-то вроде CategoriesViewModel.OnShowCategoryDetails ивент, на который View будет подписываться и по нему что-то показывать. Тут тоже ViewModel не будет знать ничего о View и при этом этот же ивент можно вызывать в любой момент у ViewModel. Минус такого подхода - за навигацию будет отвечать конкретная вьюшка. Можно правда эту подписку сделать на уровне Application-а, но в итоге получится, что он будет выступать в качестве ViewsService-а. Это в общем-то тоже не плохо, но возможно есть что-нибудь получше.

    • Предложено в качестве ответа PetrishkoMVP 23 августа 2011 г. 20:30
    • Помечено в качестве ответа PetrishkoMVP 25 августа 2011 г. 5:20
    19 августа 2011 г. 7:47
  • Спасибо, попробую первый вариант!

    А есть ли какие то рекомендации от microsoft pattern practice, например как для wpf и silverlight?

    Вообще как-то странно , что нет нормальных примеров того, как работать с prism в wp7

    20 августа 2011 г. 8:26
  • Не использовал Prism для WP7, но там наверняка так же есть InteractionRequest-ы и регионы.
    20 августа 2011 г. 20:49