微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Windows Phone 7 – 处理ViewModel中的OnNavigatedFrom / OnNavigatedTo事件

我试图找出一种我的viewmodel的方法来处理从页面导航或从To导航时保存或恢复页面的状态.

我尝试的第一件事是向页面添加一个EventToCommand行为,但事件(OnNavigatedFrom和OnNavigatedTo)被声明为protected,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对象创建一个包装器类(请参见下面的UPDATE).

最容易处理这些事件的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",(action) => RestoreState(action));
执行代码后面的命令远比整个消息传递乱七八糟.毕竟,知道它的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可能更有用,因为它已经解析出参数和值.

原文地址:https://www.jb51.cc/windows/364123.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐