MVVM Light:关于提取 RelayCommand 导航参数
MVVM Light: About extracting the RelayCommand navigation parameter
我是 MVVM 的新手,所以如果这个问题有一个简单的答案,我深表歉意,但我无法通过搜索来解决这个问题 Google。
所以,基本上,我正在使用 MVVM Light 制作一个 Windows 10 通用应用程序。使用 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 中传递参数有什么意义呢?
我是否缺少某种第三种技术?我很想在这方面学到一些东西。感谢期待。
您可以构建和使用自己的 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);
}
}
创建 INavigable:
public interface INavigable
{
void OnNavigatedTo(NavigationEventArgs e);
void OnNavigatedFrom(NavigationEventArgs e);
void OnNavigatingFrom(NavigatingCancelEventArgs e);
bool AllowGoBack();
}
在您的 Viewmodel 中实现 INavigable,您将在 Viewmodel 中处理 OnNavigatedTo,它可以访问您发送的 p 参数。
我是 MVVM 的新手,所以如果这个问题有一个简单的答案,我深表歉意,但我无法通过搜索来解决这个问题 Google。
所以,基本上,我正在使用 MVVM Light 制作一个 Windows 10 通用应用程序。使用 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 中传递参数有什么意义呢?
我是否缺少某种第三种技术?我很想在这方面学到一些东西。感谢期待。
您可以构建和使用自己的 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);
}
}
创建 INavigable:
public interface INavigable
{
void OnNavigatedTo(NavigationEventArgs e);
void OnNavigatedFrom(NavigationEventArgs e);
void OnNavigatingFrom(NavigatingCancelEventArgs e);
bool AllowGoBack();
}
在您的 Viewmodel 中实现 INavigable,您将在 Viewmodel 中处理 OnNavigatedTo,它可以访问您发送的 p 参数。