这是使用MVVM Light Messenger类的正确方法吗?

时间:2014-10-17 18:51:25

标签: c# wpf mvvm mvvm-light

我从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的博文,详细的帖子和示例。

非常感谢任何评论,建议等。

1 个答案:

答案 0 :(得分: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;
    }    
}