我从this article开始讨论如何在MVVM环境中实现导航。然后我开始阅读有关Messenger类以及在ViewModel之间进行通信的有用之处。我开始使用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;
}
}
在相应的Page1和Page2视图模型中,我有Name属性,该属性为按钮提供内容。所以这将产生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 Light工具包中实现Messenger类的正确方法。
我要感谢上面引用的Rachel Lim的博文,详细的帖子和示例。
非常感谢任何评论,建议等。
答案 0 :(得分:1)
这与我们在应用程序中的做法非常相似。
我们也为信使做了一些事情:
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;
}
}