2013-09-11 9 views
0

screenMvvmCross навигации на экране

Наш дизайнер создал макет нечто похожее на экране выше. Основная идея заключалась в том, чтобы создать приложение только с одним экраном, только красная часть экрана изменяется (т. Е. 2 ​​текстовых поля вместо 1 текстового поля), когда вы нажимаете на кнопку. Это приложение будет мультиплатформенным приложением, и я использую MvvmCross для его создания. Мой вопрос в том, как я могу добиться такого поведения в Mvvm? Моя первая мысль была sg. как и код ниже, но я не удовлетворен этим решением. У вас есть лучшее решение этой проблемы? Должен ли я каким-то образом перезаписать навигацию по умолчанию на ShowViewModel()?

public class MainViewModel : MvxViewModel 
{ 
    private MvxViewModel _currentViewModel; 
    public MvxViewModel CurrentViewModel 
    { 
     get { return _currentViewModel; } 
     set { _currentViewModel = value; RaisePropertyChanged(() => CurrentViewModel); } 
    } 

    public MainViewModel() 
    { 
     CurrentViewModel = new DefaultViewModel(); 
    } 

    public void OnButtonClick() 
    { 
     CurrentViewModel = new SecondViewModel(); 
    } 
} 

public partial class MainViewModel : MvxViewController 
{ 

     public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     FirstViewModel.WeakSubscribe(ViewModelPropertyChanged); 
    } 

     private void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs args) 
    { 
     if (args.PropertyName == "CurrentViewModel") 
     { 
      if (Model.CurrentViewModel != null) 
      { 
       if (Model.CurrentViewModel is SecondViewModel) 
       { 
              //remove bindings 
        //change View 
              //bind new viewmodel 
       } 
      } 
     } 
    } 

ответ

2

Альтернативы для такого рода 'не-страничной навигации' аналогичны тем, которые в MvvmCross Dialog:

Вы можете:

  • настроить MvxPresenter, чтобы ShowViewModel использоваться
  • Поместите специальный интерфейс в проект Core и используйте Inversion of Control для внедрения реализации из проекта пользовательского интерфейса в проект Core
  • Используйте плагин MvxMessenger и обменивайтесь сообщениями между проектом Core и UI, который запускает этот тип навигации.
  • Используйте свойство со специальным интерфейсом (например, IInteractionRequest) в ViewModel - это свойство активирует событие, когда пользовательский интерфейс должен измениться.

Лично для вашей ситуации мне очень нравится первый из этих вариантов - перехват ShowViewModel с использованием презентатора.

Еще одна альтернатива, которую я мог бы рассмотреть, - использовать какой-то «управляемый адаптером» элемент управления, который может очень легко обновить его дочернее содержимое на основе свойства CurrentViewModel. На Android это будет так же просто, как использование MvxLinearLayout с адаптером. Однако на iOS я думаю, что вам нужно будет написать что-то новое для этого - просто потому, что у iOS нет элемента управления LinearLayout/StackPanel.

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