如何在带有MVVMLight的通用应用程序Windows 8.1 / WP 8.1上使用参数进行导航

时间:2015-01-13 16:59:59

标签: parameters navigation mvvm-light win-universal-app

我使用MVVMLight开发了一个通用应用程序Windows 8.1 / Windows Phone 8.1。 我想知道哪些是在页面之间实现导航的最佳实践 有以下几页:

  • MainPage:是一个登录页面
  • 主页:是一个包含不同部分的主题“主题列表”,“联系人列表”,“用户详细信息”
  • ListArticlesFromTheme:所选主题的文章列表
  • DetailsContact:所选联系人的详细信息
  • 详细信息:所选文章的详细信息

我需要通过从页面导航到另一个页面来传递参数:所选主题,所选联系人,所选文章,...

我找到了一个导航tavers MVVMLight v5的示例实现,但没有参数: navigationservice-in-mvvm-light-v5
我找到了另一个带参数的例子,但我没有设法实现它:
navigating-to-a-new-page-from-the-view-model-in-windows-phone-8-1-universal-app

  • 通过视图或ViewModel管理导航是否更好?
  • 您是否有更详细的示例显示带参数的导航?

1 个答案:

答案 0 :(得分:1)

如果你想要:

  • 访问NavigationServicesEx.Navigate方法中传递的参数

  • 在导航页面时调用ViewModel中的方法。

Marco Minerva的这个blog展示了如何挂钩它在vanilla NavigationServiceEx类中缺少的Frame_Navigating事件。

创建博客中描述的INAVigable界面:

public interface INavigable
{
    Task OnNavigatedToAsync(object parameter, NavigationMode mode);
    void OnNavigatingFrom(NavigatingCancelEventArgs e);
    void OnNavigatedFrom();
}

为NavigationServicesEx类中的Frame.Navigating事件添加处理程序(带有一些额外的管道,请参阅博客),然后在ViewModel中实现INavigable接口。

然后,您就可以访问在Navigate调用中传递的参数:

NavigationServiceEx.Navigate(typeof(DestinationPage).FullName, yourParameter);

在ViewModel中实现的OnNavigatedToAsync方法:

public Task OnNavigatedToAsync(object parameter, NavigationMode mode)
{
    if (parameter != null)
    {
        YourThing thing = parameter as YourThing;
        this.UseYourThing(thing);
    }
    return Task.CompletedTask;
}

编辑:哦,然后浏览ViewModel。您可以在VM中调用一个方法来处理来自Command或View后面代码的导航。