记录的在传入数据时导航到另一个 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 时,它将检查该静态属性并将数据加载到内存中。
这种方法有什么问题,还是推荐了另一种方法?
看看 Prism 讨论板上的这个主题:使用 Object 作为参数进行导航。
接近尾声时,有一个解决方案使用从Uri
派生的NavigationUri
类:
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);
然后,在ViewContact
的OnNavigatedTo
方法中:
public override void OnNavigatedTo(NavigationContext navigationContext)
{
var uri = (NavigationUri)navigationContext.Uri;
SearchQuery = (Query) uri.Parameters["SearchQuery"];
}
如原始线程中所建议的,您还可以使用类来生成参数键,而不是对它们进行硬编码:
public sealed class NavigationUriParameters
{
public static readonly string SearchQuery = Guid.NewGuid().ToString();
}
在我的应用程序中,我在 URL 参数中传递了某种标识符,例如
/FlightInfo.xaml?FlightID=4
,然后在OnNavigatedTo()
方法中查找该航班 ID。 这些航班存储在 ViewModel 中,我将其作为静态属性保存在某处,所以它很相似,但这样你的 URL 是有意义的,并且返回/恢复会更好地工作。
如果您正在为 Silverlight 开发并希望支持深层链接,则必须将加载数据所需的所有信息并显示页面放在 URL 中,因为 URL 是链接中存储的内容。
在所有其他情况下(没有深层链接的 Silverlight 或 Windows Phone),您可以将(部分)信息存储在某个全局可用对象(如应用程序)中的其他位置。
如前所述,您可以传递对象的标识符并在加载页面时检索对象(从服务或缓存中获取)
您还可以将当前视图模型/数据存储在 App 对象中,只需将其绑定到新页面即可。
根据可用的资源量(时间、带宽、并发用户等),您可能希望选择其中之一,甚至根据方案在解决方案之间切换。