我是MVVM的新手,所以如果这个问题有一个简单的答案我很抱歉,但我还没有能够通过搜索Google来解决这个问题。
所以,基本上,我使用MVVM Light制作Windows 10 Universal应用程序。使用ViewModelLocator的方法导航,它工作正常。我的问题是关于附带的参数。我有以下导航方法:
public RelayCommand<SelectionChangedEventArgs> SelectedItemCommand
{
get
{
return _selectedItemCommand
?? (_selectedItemCommand = new RelayCommand<SelectionChangedEventArgs>(
p => _navigationService.NavigateTo(ViewModelLocator.SecondPageKey, p)));
}
}
我转到第二页。但是如何在目标网页上提取 p 呢?到目前为止,我已经想到了
此参数进入目标网页视图的 OnNavigatedTo 方法,然后我可以将其传递给ViewModel。但这似乎与MVVM的内容不相符。我甚至没有在我的第二页 OnNavigatedTo ,它加载得很好。
另一种方法是使用MVVMLight的 Messenger 方法在第二页的VM中获取它,这看起来更干净。但如果这是唯一正确的方法,那么在RelayCommand中传递参数的重点是什么?
我错过了某种第三种技巧吗?我喜欢在这方面学到一些东西。谢谢你的期待。
答案 0 :(得分:1)
您可以构建和使用自己的NavigationService。或者改进现有的:
创建继承自Page的BindablePage。在里面:
public class BindablePage : Page
{
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
var navigableViewModel = this.DataContext as INavigable;
if (navigableViewModel != null)
navigableViewModel.OnNavigatedTo(e);
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
var navigableViewModel = this.DataContext as INavigable;
if (navigableViewModel != null)
navigableViewModel.OnNavigatedFrom(e);
}
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
base.OnNavigatingFrom(e);
var navigableViewModel = this.DataContext as INavigable;
if (navigableViewModel != null)
navigableViewModel.OnNavigatingFrom(e);
}
}
创建无法接收:
public interface INavigable
{
void OnNavigatedTo(NavigationEventArgs e);
void OnNavigatedFrom(NavigationEventArgs e);
void OnNavigatingFrom(NavigatingCancelEventArgs e);
bool AllowGoBack();
}
在您的Viewmodel中实现INAVigable,您将在viewmodel中处理OnNavigatedTo,它可以访问您发送的p参数。