在传入数据时导航到另一个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时,它会检查静态属性并将数据加载到内存中。
这种方法有什么问题,还是推荐另一种方法?
答案 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对象中,并将其绑定到新页面。
根据可用的资源量(时间,带宽,并发用户......),您可能需要选择其中一种,甚至根据方案在解决方案之间切换。