我目前正在构建一个通用应用程序,但我现在正专注于它的WP8.1部分。我在这个项目中使用MVVMLight。
为简单起见,我们假设我在项目中只有2页。
Page1.xaml包含一个包含各种项目的列表。 Page1.xaml被绑定到它自己的ViewModel,即Page1ViewModel。列表中的每个项目代表一个viewModel,即ItemViewModel。
当我点击某个项目时,我会调用以下代码:
public RelayCommand<ItemViewModel> ItemTapCommand
{
get
{
return this._itemTapCommand ?? (this._itemTapCommand =
new RelayCommand<ItemViewModel>((msg) =>
ExecuteItempTapCommand(msg)));
}
}
点击列表中的项目时,我会调用以下代码:
private object ExecuteItempTapCommand(ItemViewModel selectedItemViewModel)
{
Page2ViewModel page2ViewModel =
SimpleIoc.Default.GetInstance<ItemViewModel>();
page2ViewModel.SelectedItem = selectedItemViewModel;
_navigationService.Navigate(typeof(Page2),
selectedItemViewModel);
return null;
}
正如您所看到的,我正在使用我的Ioc来创建我的Page2ViewModel的实例,然后我将SelectedItem
设置为selectedItemViewModel。
一旦设置完毕,我就会导航到绑定到Page2ViewModel的Page2。
我想知道的是,以上是可以的吗?我已经看到很多例子,当处理从一个页面传递到另一个页面的对象是通过传递一个Id来完成的,然后我从Page2请求信息,但是当我需要的大部分信息已经在我的时候,为什么再次请求它SelectedItemViewModel,因为它表示我在Page1。列表中的点击项。
如果不正确,使用MVVMLight的最佳方法是什么?
你能提供样品吗?我已经看到了一些关于Messaging的内容,但我不确定这会如何工作,就像我导航到我的page2一样,Page2ViewModel只会在创建页面时启动,那么它如何才能收到消息?我上面的方式似乎启动了Page2ViewModel和我的Pag2加载,它重新使用它并且所有内容都正确绑定但我不确定这是正确的方法。
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:0)
在Page2ViewModel中,为什么不使用
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Page2SelectedItem = e.Parameter as ItemViewModel;
base.OnNavigatedTo(e);
}
看起来您已经使用_navigationService.Navigate调用打包了这些数据。
有了这个设置,如果你只是改为:
会发生什么private object ExecuteItempTapCommand(ItemViewModel selectedItemViewModel)
{
_navigationService.Navigate(typeof(Page2), selectedItemViewModel);
return null;
}
答案 1 :(得分:0)
如果您在此之前做了一些工作,可以使用ViewModel来获取它。
阅读Marco Minerva撰写的这篇博文Calling ViewModel methods in response to Page navigation events using MVVM Light in WinRT
解释了如何对ViewModel中的OnNavigatedTo和OnNavigatedFrom做出反应。
这是一个非常酷的解决方案。