处理ViewModel中的OnNavigatedFrom/OnNavigatedTo事件

Jef*_*f R 10 windows-phone-7 mvvm-light

我试图找出一种方法让我的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);
}
Run Code Online (Sandbox Code Playgroud)

但这似乎有两个问题,首先是在代码隐藏页面中使用此代码.其次,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);
}
Run Code Online (Sandbox Code Playgroud)

并像这样注册它们:

Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedFrom", false, (action) => SaveState(action));
Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedTo", false, (action) => RestoreState(action));
Run Code Online (Sandbox Code Playgroud)

Dog*_*uca 5

从后面的代码执行命令比通过整个消息传递混乱更清晰.毕竟知道它的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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

更新:传入NavigationContext.QueryString可能更有用,因为它已经解析了参数和值.


Rya*_*ver 1

看来您已经找到了解决问题的方法。我还建议以下几点:

查看使用 mvvm-toolkit 中提供的消息值之一,例如:

    NotificationMessage<T>
Run Code Online (Sandbox Code Playgroud)

像这样:

    Messenger.Default.Send<NotificationMessage<PhoneApplicationPage>>(
new NotificationMessage<PhoneApplicationPage>(this, "Message"));
Run Code Online (Sandbox Code Playgroud)