2014-01-17 4 views
6

Я в процессе сравнения MvvmCross с ReactiveUI для крупного фармпроекта в Win Store, WP8, iOS, Droid. Мы уже выбрали Xamarin.ReactiveUI - Confused about Routing

Я совершенно не знаком с ReactiveUI. Мне очень нравится то, что я вижу в принципе, и я думаю, что Пол - гений. Однако детали становятся настоящим медведем. Я потратил несколько дней на отслеживание документации (руководство с 2011 года и кажется почти полностью устаревшим - в нем даже не содержится слова «Router») и пример кода.

Я смотрю образец из ReactiveUI.Samples Также проект MobileSample-RT из решения ReactiveUI.

Я основал свой маленький мир приветствия на ReactiveUI. Пример «Маршрутизация». Честно говоря, это не очень пример, поскольку все, что он делает, - это перейти от AppBootstrapper к единственному виду. Я пытаюсь сделать что-то похожее на пример «трех страниц» от MobileSample-RT. Проблема заключается в том, если я пытаюсь что-то вроде этого в моем проекте:

HostScreen.Router.Navigate.Execute(RxApp.DependencyResolver.GetService(typeof(LoginViewModel))); 

он выходит из строя (PDB символы не загружены в ReactiveUI.dll)

Если я пытаюсь это:

HostScreen.Router.NavigateCommandFor<LoginViewModel>().Execute(HostScreen); 

Same результат - жесткий сбой. Это действительно бросило меня, поскольку это похоже на то, что должно «просто работать».

Я могу назвать это:

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, как мне перейти к модели просмотра, которая уже находится в стеке навигации (или она должна быть там в первую очередь?).

Большое спасибо за любую ясность, которую вы можете предоставить.

+1

Вы упомянули, что pdb не загружен. Пол подталкивает каждую сборку к http://www.symbolsource.org/, и я нашел, что это настраивает, чтобы быть бесценным в понимании и изучении реактивных вопросов. Инструкции по настройке отладчика visual studio находятся на сайте. – Gordon

ответ

8

Если вы создаете для iOS и Android, вы просто не хотите использовать Routing - слишком много конфликтов конфликтов маршрутизации с тем, что вам нужно делать на платформах (даже на WP8 это растяжка, но я смог к взлому заставляют его работать). Вы должны придерживаться позиции «Вид-первая».

Однако, если вы используете Xamarin Forms, ReactiveUI отлично работает с маршрутизацией на базе VM (поскольку Xamarin удалось сделать все взломы, чтобы это стало возможным!).Проверьте https://github.com/paulcbetts/xamarinevolve2014 для демонстрации этого

Я знаю, что документы сосать и я работаю над новыми:

+0

Хорошо спасибо Пол. –

+0

@PaulBetts Вы по-прежнему рекомендуете избегать маршрутизации для Xamarin.ios и Xamarin.Android? Мы думаем использовать MVVMCross для навигации через viewmodel и ReactiveUI + Reactive extensions для сантехники приложения. Вы видите какие-либо проблемы с этой конфигурацией? Или есть способ, который я не вижу, чтобы перемещаться через viewmodel с ReactiveUI? – Amnysia