我只是将项目切换到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并且...这是我有点不确定的地方......
请随时给我一个完整的样本 - 确保这已经完成了一百次,但是所有的博客和教程似乎都在跳过这个最后的琐碎细节(而是集中在消息传递和ioc on on navigationservice)
谢谢!
答案 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级别处理)。