1

在传递数据时导航到另一个 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 时,它会检查该静态属性并将数据加载到内存中。

这种方法有什么问题,还是有其他推荐的方法?

4

3 回答 3

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您的方法中ViewContact

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();
}
于 2012-12-18T12:26:14.263 回答
1

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

/FlightInfo.xaml?FlightID=4

然后在方法中查找该航班 ID OnNavigatedTo()。航班存储在 ViewModel 中,我将其作为静态属性保存在某处,因此它是相似的,但这样您的 URL 是有意义的,并且返回/恢复会更好地工作。

于 2012-12-18T04:28:18.237 回答
1

如果您正在为 Silverlight 开发并希望支持深度链接,则必须将加载数据和显示页面所需的所有信息放在 URL 中,因为 url 是存储在链接中的内容。

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

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

您还可以将当前的 ViewModel/Data 存储在 App 对象中,然后简单地将其绑定到新页面。

Depending on the amount of resources (time, bandwidth, concurrent users, ...) available, you might want to pick one of these or even switch between solution depending on the scenario.

于 2012-12-18T14:04:05.230 回答