【发布时间】:2010-07-27 21:43:00
【问题描述】:
我正在尝试找出一种方法,让我的 ViewModel 在页面导航自或至时处理保存或恢复页面状态。
我尝试的第一件事是向页面添加 EventToCommand 行为,但事件(OnNavigatedFrom 和 OnNavigatedTo)被声明为受保护,并且 EventToCommand 看不到要绑定的事件。
接下来我想我会尝试使用 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));
【问题讨论】:
标签: windows-phone-7 mvvm-light