这是使用 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 类的正确方法吗的主要内容,如果未能解决你的问题,请参考以下文章

MVVM Light学习笔记:Messenger

MVVM-light 中的清理与处置(布尔)

MVVM中的Messenger

MVVM Light须要注意的10个问题

MVVM Light 和 SQL Server CE 在 vi​​ewmodel 中生成代码

MVVM Light须要注意的10个问题