2014-10-17 2 views
1

Я начал с this article о том, как реализовать навигацию в среде MVVM. Затем я начал читать о классе Messenger и насколько полезным было бы общение между ViewModels. Я решил реализовать ту же навигационную концепцию с помощью класса мессенджера и пришел с этим:Это правильный способ использования класса MVVM Light Messenger

MainViewModel:

public sealed class MainViewModel : ViewModelBase 
{ 
    public MainViewModel() 
    { 
     PageViewModels.Add(new Page1ViewModel()); 
     PageViewModels.Add(new Page2ViewModel()); 

     Messenger.Default.Register<PageNavigationMessage>(this, (pageViewModel) => 
     { 
      switch (pageViewModel.CurrentViewModel.Name) 
      { 
       case "Page1": 
        CurrentPageViewModel = PageViewModels[0]; 
        break; 
       case "Page2": 
        CurrentPageViewModel = PageViewModels[1]; 
        break; 
      } 
     }); 
    } 

    private List<IPageViewModel> _pageViewModels; 

    public List<IPageViewModel> PageViewModels 
    { 
     get 
     { 
      if (_pageViewModels == null) 
       _pageViewModels = new List<IPageViewModel>(); 
      return _pageViewModels; 
     } 
    } 

    private IPageViewModel _currentPageViewModel; 

    public IPageViewModel CurrentPageViewModel 
    { 
     get { return _currentPageViewModel; } 
     set 
     { 
      if (_currentPageViewModel != value) 
      { 
       _currentPageViewModel = value; 
       RaisePropertyChanged("CurrentPageViewModel"); 
      } 
     } 
    } 

    private ICommand _changePageCommand; 
    public ICommand ChangePageCommand 
    { 
     get 
     { 
      if (_changePageCommand == null) 
      { 
       _changePageCommand = 
        new RelayCommand<IPageViewModel>(pn => Messenger.Default.Send(new PageNavigationMessage{CurrentViewModel = pn})); 
      } 

      return _changePageCommand; 
     } 
    } 

В соответствующих ViewModels стр.1 и PAGE2 я имею свойство Имя, которое дает содержание к кнопке , Таким образом, вы создадите кнопку Page1 и кнопку Page2.

Я покажу только страницу PageViewView, потому что вторая страница в значительной степени идентична, кроме строки свойств Name.

public class Page1ViewModel : ViewModelBase, IPageViewModel 
{ 
    public string Name 
    { 
     get { return "Page1"; } 
    } 
} 

Здесь я реализовал базовый класс PageNavigationMessage:

public class PageNavigationMessage 
{ 
    public IPageViewModel CurrentViewModel { get; set; } 
} 

Это работает очень хорошо, но мне было интересно, если это правильный способ реализации класса вестника инструментария MVVM Light.

Я хотел бы поблагодарить сообщение в блоге Рейчел Лим, упомянутое выше, для подробного сообщения и примера.

Любые комментарии, предложения и т. Д. Приветствуются.

ответ

1

Это почти так же, как мы это делаем в нашем приложении.

Некоторые вещи мы делаем для мессенджера:

  • Сделать общий класс MessageTypes, который содержит все различные сообщения. Поскольку большинство из них - это просто объявление с наследованием MessageBase, класс для каждого сообщения будет бесполезным.
  • Если ваш класс регистрируется для более чем одного или двух сообщений, мы реорганизовали регистрацию сообщений в отдельном методе, чтобы легко добавлять/удалять сообщения.
  • Если логика вашего сообщения больше, чем строка или две, мы обычно ставим их в дополнительном методе, так, например, для примера, который бы:

public MainViewModel() 
{ 
    Messenger.Default.Register<PageNavigationMessage>(this, SetPageViewModel); 
} 

private void SetPageViewModel(IPageViewmodel selectedVm) 
{ 

    switch (selectedVm.CurrentViewModel.Name) 
    { 
     case "Page1": 
      CurrentPageViewModel = PageViewModels[0]; 
      break; 
     case "Page2": 
      CurrentPageViewModel = PageViewModels[1]; 
      break; 
    }  
} 
Смежные вопросы