mvvmlight - 为视图模型选取url参数的“正确方法”是什么

时间:2011-08-16 13:48:16

标签: 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)的调用导航到“/DetailPage.xaml?DetailId=12”

这样的网址

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

  • 如何将DetailPage连接到DetailId为12的DetailView?
  • 我应该使用ViewLocator上的属性以某种方式在Xaml中执行此操作吗?
  • 我应该在NavigatedTo方法中执行此操作吗?

请随时给我一个完整的样本 - 确保这已经完成了一百次,但是所有的博客和教程似乎都在跳过这个最后的琐碎细节(而是集中在消息传递和ioc on on navigationservice)

谢谢!

2 个答案:

答案 0 :(得分:5)

您可以检索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;
        }
    }
}

答案 1 :(得分:0)

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