Я начал с this article о том, как реализовать навигацию в среде MVVM. Затем я начал читать о классе Messenger и насколько полезным было бы общение между ViewModels. Я решил реализовать ту же навигационную концепцию с помощью класса мессенджера и пришел с этим:Это правильный способ использования класса MVVM Light 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;
}
}
В соответствующих ViewModels стр.1 и PAGE2 я имею свойство Имя, которое дает содержание к кнопке , Таким образом, вы создадите кнопку Page1 и кнопку Page2.
Я покажу только страницу PageViewView, потому что вторая страница в значительной степени идентична, кроме строки свойств Name.
public class Page1ViewModel : ViewModelBase, IPageViewModel
{
public string Name
{
get { return "Page1"; }
}
}
Здесь я реализовал базовый класс PageNavigationMessage:
public class PageNavigationMessage
{
public IPageViewModel CurrentViewModel { get; set; }
}
Это работает очень хорошо, но мне было интересно, если это правильный способ реализации класса вестника инструментария MVVM Light.
Я хотел бы поблагодарить сообщение в блоге Рейчел Лим, упомянутое выше, для подробного сообщения и примера.
Любые комментарии, предложения и т. Д. Приветствуются.