gpt4 book ai didi

c# - 这是使用MVVM Light Messenger类的正确方法吗

转载 作者:行者123 更新时间:2023-12-03 10:36:27 25 4
gpt4 key购买 nike

我从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 View 模型中,我具有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的博客帖子,其中提供了详细的帖子和示例。

任何意见,建议等,不胜感激。

最佳答案

这与我们在应用程序中执行的方式几乎相同。

我们还为Messenger做一些事情:

  • 创建一个通用的MessageTypes类,其中包含所有不同的消息。由于它们大多数只是一个继承了MessageBase的声明,因此每个消息的类都是一团糟。
  • 如果您的类(class)注册了多于一条或两条消息,我们将使用另一种方法重构消息注册,以轻松添加/删除消息
  • 如果您的讯息逻辑不止一两行,我们通常会将它们放在额外​​的方法中,例如对于您的示例将是:

  • 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;
    }
    }

    关于c# - 这是使用MVVM Light Messenger类的正确方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26431542/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com