2014-03-03 2 views
1

У меня возникли трудности с пониманием, как будет работать навигационная система mvvmcross в более сложных ситуациях. Давайте примем приложение, которое мы хотим сделать для WP7 и Metro, используя mvvmcross в качестве базы. Мы создаем три модели вида (FirstViewModel, SecondViewModel, ThirdVIewModel), заполняем их некоторыми данными и используем регулярную навигацию для перемещения между ними (используя ShowViewModel() методов). Пока это хорошо работает, и мы хотим, чтобы этот вид навигации на устройстве Windows Phone был разобран, что представляет собой три отдельных вида, которые мы можем перемещать взад и вперед.MvvmCross и сложная навигация

Теперь, смотря с точки зрения приложения Metro, у нас есть гораздо больший экран, обычно используемый в режиме lanscape, поэтому мы решили, что контент этих трех страниц будет показан как одна страница.

Вот где я вижу проблему - потому что обе версии приложения используют одну и ту же Core и одну и ту же иерархию моделей представлений - кажется, невозможно иметь такое поведение в одно и то же время. Навигация с FirstViewModel на SecondViewModel не распространяется на версию приложения Metro, потому что мы на самом деле на первом экране, который мы хотим содержать все данные из всех трех моделей. На противоположной стороне - мы не можем помещать эти три модели просмотра в более крупную и использовать их как единую модель обзора, потому что эти три отдельные модели просмотра вместе с обычной навигацией хорошо работают для нас на Windows Phone.

Есть ли способ обеспечить такую ​​нестандартную навигацию с использованием mvvmcross? Если да, то какой-то простой код, который должен быть перезаписан/добавлен (что я не вижу, может быть?), Или, скорее, сложный материал, требующий значительного количества времени и кодирования, чтобы включить такую ​​функциональность?

ответ

1

Да, определенно, хотя вам нужно будет написать некоторые пользовательские классы. Если вы пишете пользовательский презентатор для каждой платформы, вы можете использовать концепцию регионов, где ваши представления могут указывать, какой регион они хотят отображать, чтобы при отображении ShowViewModel ваш пользовательский презентатор мог проверить, запрашивается ли конкретный регион соответствующим представлением и обрабатывать по мере необходимости.

Посмотрите на Stuart Lodges n + 1 на пользовательских презентаторах. Также google «Презентаторы региона MVVMCross». Вы должны найти полезный материал.

Приветствия, Тристан

2

MvvmCross имеет различные способы изменить свой механизм по умолчанию. Хорошее место, чтобы начать это вики: https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup

Что касается вашего примера:

Одна идея у меня есть создать MainViewModel, который содержит все три View-модели для приложения WindowStore.

У вас все еще есть проект MainViewModel в Core, даже если он используется только в приложении Windows Store. Вы можете использовать его в дальнейшем для Android или IOS таблетки приложения тоже:

public class MainViewModel : MvxViewModel 
{ 
    public FirstViewModel First { get; private set; } 
    public SecondViewModel Second { get; private set; } 
    public ThirdViewModel Third { get; private set; } 

    public MainViewModel() 
    { 
      this.First = new FirstViewModel(); 
      this.Second = new SecondViewModel(); 
      this.Third = new ThirdViewModel(); 
    } 
} 

Далее, в зависимости от платформы вам необходимо либо перейти к MainViewModel или FirstViewModel.

Существует несколько способов сделать это в MvvmCross.

Один из вариантов имеет CustomAppStart, который перемещается к базовой модели в зависимости от платформы.

В библиотеке Core:

public class CustomAppStart 
     : MvxNavigatingObject 
     , IMvxAppStart 
    { 
     public void Start(object hint = null) 
     { 
      var platform == GetRunningPlatform(); 
      switch(platform) 
      { 
       case Platform.WinStore: 
        ShowViewModel<MainViewModel>(); 
        break; 
       case Platform.WinPhone: 
        ShowViewModel<FirstViewModel>(); 
        break;    
       ...  
     } 
    } 

Для того, чтобы обнаружить, какая платформа приложение работает на, снова есть несколько способов сделать это. Проверить How can I detect the platform at runtime using MvvMCross? или как MvvmLight делает это: http://mvvmlight.codeplex.com/SourceControl/network/forks/onovotny/MvvmLightPortable/changeset/view/f356af74426f#GalaSoft.MvvmLight/Portable/GalaSoft.MvvmLight/Helpers/DesignerPlatformLibrary.cs

Другая идея состоит в том, чтобы иметь отдельный WinPhoneAppStart и WinStoreAppStart на каждой платформе. Обратите внимание, что запуск пользовательского приложения (IMvxAppStart) должен быть зарегистрирован до создания IMvxApplication.

В Windows Store App:

public class WinStoreAppStart : MvxNavigatingObject, IMvxAppStart 
{ 
    public void Start(object hint = null) 
    { 
     ShowViewModel<MainViewModel>(); 
    } 
} 

public class Setup : MvxStoreSetup 
{ 
    protected override IMvxApplication CreateApp() 
    { 
     Mvx.RegisterType(typeof(IMvxAppStart), typeof(WinStoreAppStart)); 
     return new Core.App(); 
    } 
} 

Уф, я надеюсь, что это поможет вам. Дайте мне знать, если вам нужна дополнительная информация.

EDIT:

Если 3 страницы не представляют начальную главную страницу, то одна идея у меня есть, чтобы использовать пользовательский ведущий: https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup#wiki-custom-presenters

В приложении WinStore, вы можете перейдите в FirstViewModel и вместо этого создайте MainViewModel.

Еще одна идея:

Вы можете иметь платформу зависимый контроллер, который реализует вид-модель навигации.

+0

Спасибо за быстрый ответ! Пользовательский AppStart или отдельное приложение начнет делать трюк, но только в начале приложения (начало приложения :). Что, если я захочу подобное поведение позже во время навигации, скажем, иметь отдельную навигацию между страницами 7, 8 и 9 на мобильном телефоне и одну навигацию на «большую страницу», содержащую контент 7,8 и 9 в приложении метро, ​​используя тот же проект Core ? – user3373981

+0

Я редактирую свой ответ, чтобы включить этот сценарий. Отметьте как ответ, если вы считаете, что это то, что вам нужно. –

Смежные вопросы