Windows phone 7 mvvmlight-什么';这是“什么?”;“正确的方法”;为视图模型拾取url参数的步骤

Windows phone 7 mvvmlight-什么';这是“什么?”;“正确的方法”;为视图模型拾取url参数的步骤,windows-phone-7,mvvm-light,Windows Phone 7,Mvvm Light,我只是将一个项目切换到mvvmlight,并尝试以“正确的方式”做事 我有一个带有列表框的简单应用程序 当在列表框中选择一个项目时,我已经连接了一个RelayCommand 此RelayCommand导致对INavigationService的调用(http://geekswithblogs.net/lbugnion/archive/2011/01/06/navigation-in-a-wp7-application-with-mvvm-light.aspx)它会导航到类似“/DetailPag

我只是将一个项目切换到mvvmlight,并尝试以“正确的方式”做事

我有一个带有列表框的简单应用程序

当在列表框中选择一个项目时,我已经连接了一个RelayCommand

此RelayCommand导致对INavigationService的调用(http://geekswithblogs.net/lbugnion/archive/2011/01/06/navigation-in-a-wp7-application-with-mvvm-light.aspx)它会导航到类似“/DetailPage.xaml?DetailId=12”的url

然后加载DetailPage.xaml并。。。这就是我有点不确定的地方

  • DetailPage应该如何连接到DetailId为12的DetailView
  • 我是否应该在Xaml中使用ViewLocator上的属性执行此操作
  • 我应该在NavigatedTo方法中执行此操作吗
请随意给我指一个完整的示例-当然这已经做了(十万)次了,但是所有的博客和教程似乎都跳过了最后一个琐碎的细节(重点放在信息和国际奥委会的导航服务上)


谢谢

可以检索URL参数的唯一位置是视图中。因此,由于您的视图可能依赖于它,因此您应该在OnNavigatedTo方法中获取它

然后,您应该将其传递给您的viewmodel,或者使用消息传递(如果您要求的话,可以发送到昂贵的消息),或者通过引用您的datacontext(我认为这就是viewmodel),并在此基础上执行一个方法

private AddTilePageViewModel ViewModel
{
    get
    {
        return DataContext as AddTilePageViewModel;
    }
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var postalCode = NavigationContext.TryGetKey("PostalCode");
    var country = NavigationContext.TryGetStringKey("Country");

    if (postalCode.HasValue && string.IsNullOrEmpty(country) == false)
    {
        ViewModel.LoadCity(postalCode.Value, country);
    }

    base.OnNavigatedTo(e);
}
我正在为NavigationContext使用一些特殊的扩展,以使其更简单

namespace System.Windows.Navigation
{
    public static class NavigationExtensions
    {
        public static int? TryGetKey(this NavigationContext source, string key)
        {
            if (source.QueryString.ContainsKey(key))
            {
                string value = source.QueryString[key];

                int result = 0;
                if (int.TryParse(value, out result))
                {
                    return result;
                }
            }

            return null;
        }

        public static string TryGetStringKey(this NavigationContext source, string key)
        {
            if (source.QueryString.ContainsKey(key))
            {
                return source.QueryString[key];
            }

            return null;
        }
    }
}

创建一个新的WindowsPhoneDataBound应用程序,它有一个如何处理视图之间导航的示例。基本上,在视图中处理导航部分,然后将视图的DataContext设置为查询字符串。我认为它与MVVM模式配合得很好,因为您的ViewModels不必知道任何有关导航的信息(IMO应该在UI级别处理导航)。

很好的扩展!非常方便。您可以做的另一种选择是,如果您在列表框中使用ViewModel,我会将列表框拔出。选择EdItem out,将其投射到ViewModel,然后将其填充到PhoneApplicationService.Current.State[“some key”]中,并在目标视图的OnNavigatedTo中将其拔出。这样我就不用处理querystring了,但任何一种方法都可以。使用querystring都更便宜,而且对tombstone更简单——OS tombstone为我们提供了它!最后我刚刚接受了这个。。。仍然希望有更整洁的方法——目前我正在开发一个继承树,它可能正好可以做到这一点(当我解决它时会更多!)