ReactiveUI - 对路由感到困惑

时间:2014-01-17 02:41:46

标签: mvvm routing reactiveui

我正在为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”,如何导航到已经在导航堆栈中的视图模型(或者它应该在那里?)。

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

1 个答案:

答案 0 :(得分:8)

如果您正在为iOS和Android构建,那么您根本就不想使用路由 - 路由的概念与平台要求您做的事情冲突太多(即使在WP8上它也是一段时间,但我能够hacky让它工作)。你应该坚持使用View-first location。

但是,如果您使用的是Xamarin Forms,ReactiveUI可以很好地处理基于VM的路由(因为Xamarin设法完成了所有的黑客操作以使其成为可能!)。查看https://github.com/paulcbetts/xamarinevolve2014了解它的演示

我知道文档太糟糕了,我正在开发新文档: