【发布时间】:2014-01-17 02:41:46
【问题描述】:
我正在为 Win Store、WP8、iOS、Droid 上的一个主要制药项目比较 MvvmCross 和 ReactiveUI。我们已经选择了 Xamarin。
我对 ReactiveUI 完全陌生。我真的很喜欢我所看到的原则,我认为保罗是个天才。然而,细节正在成为一个真正的熊。我花了几天时间来查找文档(该手册是 2011 年的,似乎几乎完全过时了——它甚至不包含“路由器”这个词)和示例代码。
我正在查看来自 ReactiveUI.Samples 的示例 还有来自 ReactiveUI 解决方案的 MobileSample-RT 项目。
我的小世界基于 ReactiveUI.Samples “路由”示例。坦率地说,这并不是一个示例,因为它所做的只是从 AppBootstrapper 导航到唯一的视图。我正在尝试做类似于 MobileSample-RT 中的“三页”示例的事情。问题是,如果我在我的项目中尝试这样的事情:
HostScreen.Router.Navigate.Execute(RxApp.DependencyResolver.GetService(typeof(LoginViewModel)));
崩溃(ReactiveUI.dll 中未加载 pdb 符号)
如果我试试这个:
HostScreen.Router.NavigateCommandFor<LoginViewModel>().Execute(HostScreen);
同样的结果 - 严重崩溃。这真的让我很震惊,因为它似乎应该“正常工作”。
我可以这样称呼:
HostScreen.Router.Navigate.Execute(new LoginViewModel(HostScreen));
正如预期的那样,它确实符合我的看法。我还在主屏幕上连接了一个后退按钮:
this.OneWayBind(AppBootstrapper, x => x.Router.NavigateBack, x => x.BackButton.Command);
这确实从我刚刚导航到的视图中移回了。
所以现在我想再次前进。我(再次)单击执行此操作的按钮:
HostScreen.Router.Navigate.Execute(new LoginViewModel(HostScreen));
然后我回到那个观点。然而,这一次需要点击 2 次后退按钮才能真正向后移动。如果我然后再次向前移动,则下次需要单击 3 次。 NavigationStack 正在填满 LoginViewModel 的新实例。
那么,进行路由/导航的正确方法是什么?为什么这些命令会崩溃?而不是每次在 Navigate.Execute 中调用“new”,我如何导航到已经在导航堆栈中的视图模型(或者它应该首先存在?)。
非常感谢您提供的任何清晰度。
【问题讨论】:
-
您提到 pdb 未加载。 Paul 将每个构建推送到 symbolsource.org,我发现配置它对于理解和学习响应式 UI 非常宝贵。网站上有关于如何配置 Visual Studio 调试器的说明。
标签: mvvm routing reactiveui