2014-10-17 54 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我,让内容给该按钮的名称属性。所以这会产生Page1按钮和Page2按钮。

我将仅显示Page1ViewModel,因为第二页与Name属性字符串几乎完全相同。

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

在这里我实现了一个基本的PageNavigationMessage类:

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

这工作得很好,但我想知道,这是落实在MVVM光工具包信使类的正确方法。

我想感谢上面引用的Rachel Lim的博客文章,详细的文章和示例。

任何意见,建议等,非常感谢。

回答

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; 
    }  
}