windows-phone-7 - 处理 ViewModel 中的 OnNavigatedFrom/OnNavigatedTo 事件

标签 windows-phone-7 mvvm-light

我试图找出一种方法,让我的 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/

相关文章:

windows-phone-7 - 在 WP7 上使用 MVVM 时如何最好地将弹出窗口添加到可视化树

soap - 如何在 Windows Phone 7 上使用 SOAP API 将对象放在亚马逊 S3 上?

c# - 在 MvvmLight View 模型上调用 Cleanup() 是否取消注册所有消息

c# - 如何在 WP7 上播放在线广播?

windows-phone-7 - 在主机上使用无线适配器时无法将 Windows Phone 模拟器连接到 Internet

c# - 在 wp7 上使用 mvvm light 进行条件绑定(bind)

wpf - 如何使用ViewModelLocator创建非键控,非缓存的ViewModel

windows-phone-7 - MVVM是否适合WP7应用开发?

c# - MVVMLight 命令 CanExecute 在异步调用后未触发

unity-container - 多实例 ViewModel 和 ViewModelLocator