我一直在使用NavigationService
's Navigate
导航到我的 WP7 Silverlight 应用程序中其他页面的方法:
NavigationService.Navigate(new Uri("/Somepage.xaml?val=dreas", UriKind.Relative));
From Somepage.xaml
,然后我检索查询字符串参数,如下所示:
string val;
NavigationContext.QueryString.TryGetValue("val", out val);
我现在需要使用类似方式传递复杂对象的方法。我怎样才能做到这一点无需序列化对象每次我需要将其传递到新页面时?
这是一个极其复杂的问题,没有简单的解决方案。没有任何神奇的 API 可以适用于任何应用程序来解决这个问题。
传递导航数据的核心问题是墓碑化。默认情况下唯一被逻辑删除的数据是导航 URI。因此,如果您使用 QueryString 参数,它将被逻辑删除和您的代码自动选取。不过,任何时候您手动传递对象的实例时,都必须自己手动为该实例进行逻辑删除。
因此,如果您导航到“/CowDetails.xaml?ID=1”,您的页面可能会通过选择 ID 查询字符串参数来实现完美的逻辑删除。但是,如果您以某种方式为 CowDetails 页面提供“new Cow() { ID = 1}”,您必须确保自己对该值进行逻辑删除和僵尸化。
还有就是时间安排的问题。在调用 NavigationService.Navigate 时,您正在导航的页面还没有实际的实例。因此,即使您正在导航到 FooPage 并准备好 FooData,也无法立即将 FooPage 连接到 FooData。您必须等到 PhoneApplicationFrame.Naviged 事件触发才能向 FooPage 提供 FooData。
我通常处理这个问题的方式是:
- 拥有一个带有对象类型 Data 属性的 BasePage
- 让 NavigationHelper 获取页面 URI 和数据: NavigationHelper.Navigate("foo.xaml", fooData)
- 让 NavigationHelper 注册到 PhoneApplicationFrame.Naviged 事件,如果它是“foo.xaml”,则将 BasePage.Data 设置为 FooData。
- 让 BasePage 使用 JSON.Net 来逻辑删除和僵尸化 BasePage.Data。
- 在 BasePage 上,我有一个 OnDataSet 虚拟方法,一旦通过 Zombification 或 Navigation 填充 Data 属性,就会调用该方法。在这种方法中,与业务数据有关的所有事情都会发生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)