2014-10-17 50 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; 
    }  
}