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



记录的在传入数据时导航到另一个 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);

然后,在ViewContactOnNavigatedTo方法中:

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 对象中,只需将其绑定到新页面即可。

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

相关内容

最新更新