UWP:如何将参数传递给导航页面的ViewModel?

时间:2016-10-20 10:15:02

标签: c# mvvm uwp

所以我正在创建UWP应用程序,并使用方法

Frame.Navigate(Type type)

浏览我的观点。但是我的一个页面需要传递带导航的对象,所以我使用这个方法

Frame.Navigate(Type type, object param)

然后我可以在页面的代码隐藏中获取参数,如下所示:

public object NavigationParameter { get; private set; }

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    NavigationParameter = e.Parameter;
}

这很棒,但我使用的是MVVM模式,所以我希望在我的页面的VM上获取此参数。我怎么能这样做?

P.S。:零代码背后的解决方案将是非常壮观的。

2 个答案:

答案 0 :(得分:1)

我建议你看看一些MVVM框架,它可以为你处理这样的东西,并让你实现你目标的光荣无代码。我使用并推荐Caliburn.Micro,因为它包含您需要的一切(导航服务,自动视图模型绑定等)。

答案 1 :(得分:1)

如果你正在使用 UWP和MVVM Light ,并希望:

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

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

Marco Minerva的这个blog建议如何在目标页面导航到的时候挂钩到Frame_Navigating事件(它从vanilla NavigationServiceEx类中丢失)以访问参数。

tl; dr

创建博客中描述的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;
}