将数据传输到另一个XAML页面的最佳方法是什么?

时间:2012-12-18 03:37:30

标签: silverlight xaml windows-phone windows-phone-8

在传入数据时导航到另一个XAML页面的文档化方法似乎是将数据序列化为URL参数。这适用于简单的参数,例如单个数据库密钥:

NavigationService.Navigate(new Uri("/ViewContact.xaml?contactid=" + cid, UriKind.Relative));

但是,如果您想传递相当复杂的数据结构,例如搜索查询,该怎么办?此查询可能包含关键字,各种过滤器,项目数组等。使用URL参数表达此类数据相当困难。

问题:导航到另一个页面的推荐技术是什么,传入非平凡的参数?

一个想法是首先将数据或查询设置为您导航到的页面的静态属性:

Query q = new Query();
// Set various parameters
ViewContact.SearchQuery = q;
NavigationService.Navigate(new Uri("/ViewContact.xaml?contactid=", UriKind.Relative));

然后,当加载ViewContact时,它会检查静态属性并将数据加载到内存中。

这种方法有什么问题,还是推荐另一种方法?

3 个答案:

答案 0 :(得分:2)

看一下Prism讨论区的这个帖子:Navigation using Object as parameter

接近最后,有一个使用NavigationUri派生的Uri类的解决方案:

public sealed class NavigationUri : Uri
{
  public NavigationUri(string uri)
    : base(uri, UriKind.Relative)
  {
    Parameters = new Dictionary<string, object>();
  }

  public Dictionary<string, object> Parameters
  {
    get;
    private set;
  }
}

(我将构造函数设为公开)

然后您可以这样使用它:

var uri = new NavigationUri("/ViewContact.xaml");
uri.Parameters["SearchQuery"] = q;
NavigationService.Navigate(uri);

然后,使用OnNavigatedTo的{​​{1}}方法:

ViewContact

正如原始线程中所建议的那样,您也可以使用类生成参数键而不是硬编码:

public override void OnNavigatedTo(NavigationContext navigationContext)
{
  var uri = (NavigationUri)navigationContext.Uri;
  SearchQuery = (Query) uri.Parameters["SearchQuery"];
}

答案 1 :(得分:1)

在我的应用中,我在URL参数中传递了某种标识符,例如

/FlightInfo.xaml?FlightID=4

然后在OnNavigatedTo()方法中查找该航班ID。这些航班存储在ViewModel中,我将其作为静态属性保存在某处,所以它类似,但这样你的URL是有意义的,后退/恢复会更好。

答案 2 :(得分:1)

如果您正在为Silverlight开发并希望支持深层链接,则必须提供加载数据所需的所有信息并在URL中显示该页面,因为该URL是存储在链接中的。

在所有其他情况下(Silverlight没有深层链接或Windows Phone),您可以将信息(部分)存储在某些全局可用对象(如App)的其他位置。

如上所述,您可以传递对象的标识符并在加载页面时检索对象(从服务或缓存中获取)

您还可以将当前ViewModel / Data存储在App对象中,并将其绑定到新页面。

根据可用的资源量(时间,带宽,并发用户......),您可能需要选择其中一种,甚至根据方案在解决方案之间切换。