2012-12-18 59 views
1

在传递数据时导航到另一个XAML页面的文档化方式似乎是将数据序列化为URL参数。这对于简单的参数的伟大工程,如单个数据库键:将数据传输到另一个XAML页面的最佳方式是什么?

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加载,它会检查静态属性和将数据加载到内存中。

这种方法有什么问题,或者是否存在推荐的另一种方法?

回答

2

看看Prism讨论板上的这个主题:Navigation using Object as parameter

临近年底,有利用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; 
    } 
} 

(我做出的构造函数public)

然后,您可以使用它,像这样:

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(); 
} 
+1

这很有趣 - 我会小心地测试应用程序何时被墓碑化并返回,如果参数恢复以及Uri。 – gregstoll

+0

是的。我通常使用这两种机制:如果我需要的数据已经加载到内存中(例如,在View中导航),并且原始Uri参数作为回退(如果数据尚未加载),则这一个机制。 –

+0

'+ 1'为这个想法..但是,看起来有点冒险,我不得不测试以确保它与后退/前进堆栈一起工作。 –

1

在我的应用我已经通过某种形式的URL中的参数标识,如

/FlightInfo.xaml?FlightID=4 

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

1

如果您正在为Silverlight开发,并想以支持深层链接,你将有将所需的所有信息加载到数据中,并在URL中显示页面,因为URL是存储在链接中的。

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

如前所述,您可以加载页面

(从服务或缓存取)时传递对象的标识符和检索的对象你也可以保存当前视图模型/数据的应用对象,只需将其绑定到新页面。

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

+0

我正在谈论的场景是,如果没有一个简单的标识符来检索对象。在这种情况下,我试图通过无法通过URL参数轻松表示的搜索条件。我认为只是进行异步搜索并将其存储在App对象上是正确的方法。 –

相关问题