Windows phone 7 mvvmlight-什么';这是“什么?”;“正确的方法”;为视图模型拾取url参数的步骤
我只是将一个项目切换到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并。。。这就是我有点不确定的地方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
- 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为我们提供了它!最后我刚刚接受了这个。。。仍然希望有更整洁的方法——目前我正在开发一个继承树,它可能正好可以做到这一点(当我解决它时会更多!)