这是使用 MVVM Light Messenger 类的正确方法吗
Posted
技术标签:
【中文标题】这是使用 MVVM Light Messenger 类的正确方法吗【英文标题】:Is this the correct way to use the MVVM Light Messenger class 【发布时间】:2014-10-17 18:51:25 【问题描述】:我从this article 开始了解如何在 MVVM 环境中实现导航。然后我开始阅读 Messenger 类以及在 ViewModel 之间进行通信的有用性。我开始使用 messenger 类实现相同的导航概念,并提出了这个:
主视图模型:
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 PageNavigationMessageCurrentViewModel = 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 的博客文章,其中提供了详细的文章和示例。
非常感谢任何 cmets、建议等。
【问题讨论】:
【参考方案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;
【讨论】:
以上是关于这是使用 MVVM Light Messenger 类的正确方法吗的主要内容,如果未能解决你的问题,请参考以下文章