Mvvm ReactiveUI-对路由感到困惑

Mvvm ReactiveUI-对路由感到困惑,mvvm,routing,reactiveui,Mvvm,Routing,Reactiveui,我正在比较MvvmCross和ReactiveUI,这是一个关于Win Store、WP8、iOS和Droid的大型制药项目。我们已经选择了Xamarin 我对ReactiveUI完全不熟悉。原则上我很喜欢我所看到的,我认为保罗是个天才。然而,细节正在成为一个真正的负担。我花了几天的时间追踪文档(手册是2011年的,看起来几乎完全过时了——它甚至没有包含“路由器”一词)和示例代码 我在看来自ReactiveUI的样本 此外,项目还从ReactiveUI解决方案中移动示例RT 我的hello小世界

我正在比较MvvmCross和ReactiveUI,这是一个关于Win Store、WP8、iOS和Droid的大型制药项目。我们已经选择了Xamarin

我对ReactiveUI完全不熟悉。原则上我很喜欢我所看到的,我认为保罗是个天才。然而,细节正在成为一个真正的负担。我花了几天的时间追踪文档(手册是2011年的,看起来几乎完全过时了——它甚至没有包含“路由器”一词)和示例代码

我在看来自ReactiveUI的样本 此外,项目还从ReactiveUI解决方案中移动示例RT

我的hello小世界基于ReactiveUI.Samples“路由”示例。坦白地说,这不是一个很好的例子,因为它所做的只是从AppBootstrapper导航到唯一的视图。我试图做一些类似于MobileSample-RT中的“三页”示例的事情。问题是,如果我在我的项目中尝试类似的事情:

HostScreen.Router.Navigate.Execute(RxApp.DependencyResolver.GetService(typeof(LoginViewModel)));
它崩溃(未在ReactiveUI.dll中加载pdb符号)

如果我尝试这样做:

HostScreen.Router.NavigateCommandFor<LoginViewModel>().Execute(HostScreen);
正如我所预料的那样,这确实符合我的观点。我还在主屏幕上连接了一个后退按钮:

this.OneWayBind(AppBootstrapper, x => x.Router.NavigateBack, x => x.BackButton.Command);
这确实从我刚才浏览的视图中向后移动了

所以现在我想再次前进。我(再次)单击执行此操作的按钮:

我回到那个观点。然而,这一次需要点击两下后退按钮才能真正后退。如果我再次向前移动,下次需要单击3次。NavigationStack中充满了LoginViewModel的新实例

那么,路由/导航的正确方式是什么?为什么那些命令会崩溃?与每次在Navigate.Execute中调用“new”不同,我如何导航到已经在导航堆栈中的viewmodel(或者它首先应该在那里?)


非常感谢您提供的任何清晰信息。

如果您是为iOS和Android构建的,您根本不想使用路由-路由的概念与平台希望您做的事情冲突太多(即使在WP8上,这也是一个延伸,但我能够通过黑客使其工作)。您应该坚持视图优先位置

但是,如果您使用的是Xamarin表单,那么ReactiveUI在基于VM的路由方面工作得非常好(因为Xamarin设法进行了所有的黑客操作,使之成为可能!)。查看它的演示

我知道这些文件很烂,我正在做新的:

  • -拉取请求/进度
  • -可浏览版本

您提到pdb未加载。Paul将每个构建都推到,我发现配置它对于理解和学习reactiveui是非常宝贵的。网站上有关于如何配置visual studio调试器的说明。@PaulBetts您仍然建议避免对Xamarin.ios和Xamarin.Android进行路由吗?我们正在考虑使用MVVMCross通过viewmodel进行导航,并使用ReactiveUI+reactiveextensions进行应用程序的管道设计。您是否看到有关此配置的任何问题?或者有一种我看不到的方法可以通过带有ReactiveUI的viewmodel进行导航?
this.OneWayBind(AppBootstrapper, x => x.Router.NavigateBack, x => x.BackButton.Command);
HostScreen.Router.Navigate.Execute(new LoginViewModel(HostScreen));