我试图找出一种方法,让我的 ViewModel 在页面从或到导航时处理保存或恢复页面的状态。
我尝试的第一件事是向页面添加 EventToCommand 行为,但事件(OnNavigatedFrom 和 OnNavigatedTo)被声明为 protected ,并且 EventToCommand 看不到要绑定(bind)的事件。
接下来,我想我会尝试使用 Messenger 类使用 View 后面的代码中的代码将消息传递给 ViewModel:
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
Messenger.Default.Send<PhoneApplicationPage>(this);
base.OnNavigatedFrom(e);
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
Messenger.Default.Send<PhoneApplicationPage>(this);
base.OnNavigatedTo(e);
}
但这似乎有两个问题,首先是在代码后面的页面中有此代码。其次,ViewModel 无法区分 OnNavigatedFrom 和 OnNavigatedTo 事件,而无需为 PhoneApplicationPage 对象创建一个包装类(请参阅下面的更新)。
处理这些事件最适合 MVVM-Light 的方式是什么?
更新:
我能够通过发送这样的消息来解决第二个问题:
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
Messenger.Default.Send<PhoneApplicationPage>(this,"NavigatedFrom");
base.OnNavigatedFrom(e);
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
Messenger.Default.Send<PhoneApplicationPage>(this, "NavigatedTo");
base.OnNavigatedTo(e);
}
并像这样注册它们:
Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedFrom", false, (action) => SaveState(action));
Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedTo", false, (action) => RestoreState(action));
最佳答案
从后面的代码执行命令比浏览整个消息传递过程要干净得多。毕竟 View 知道它的 DataContext 并没有错。
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
viewModel.NavigatedToCommand.Execute(e.Uri);
}
ProfileViewModel viewModel
{
get
{
return this.DataContext as ProfileViewModel;
}
}
更新:传入 NavigationContext.QueryString 可能更有用,因为它已经解析出参数和值。
关于windows-phone-7 - 处理 ViewModel 中的 OnNavigatedFrom/OnNavigatedTo 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3348269/