2013-11-21 8 views
0

Я использую MVVMCross с Xamarin для разработки приложения для Android. У меня есть переменная _currentCommand, которая не изменяется в пределах свойства, как я ожидал. У меня есть этот ViewModel:MvvmCross частная переменная не меняющаяся стоимость

public class FooNavigationViewModel : MvxViewModel { 
    public FooNavigationViewModel() { 
     _viewModels.Add (new MvxCommand (() => ShowViewModel<DatePickerViewModel>())); 
     _viewModels.Add (new MvxCommand (() => ShowViewModel<FooReasonViewModel>())); 
     _viewModels.Add (new MvxCommand (() => ShowViewModel<FooBleedListViewModel>())); 
    } 

    private List<MvxCommand> _viewModels = new List<MvxCommand>(); 
    private MvxCommand _currentCommand; 
    public MvxCommand NextCommand { 
     get { 
      int nextViewId = _currentCommand == null ? 1 : _viewModels.IndexOf (_currentCommand) + 1; 
      if (nextViewId >= _viewModels.Count) { 
       return new MvxCommand (() => ShowViewModel<FooSummaryViewModel>()); 
      } else { 
       _currentCommand = _viewModels [nextViewId]; 
       return _currentCommand; 
      } 
     } 
    } 

    public MvxCommand CancelCommand { 
     get { 
      return _currentCommand; 
       //new MvxCommand (() => ShowViewModel<MainMenuViewModel>()); 
     } 
    } 

    public MvxCommand PreviousCommand { 
     get { 
      int nextViewId = _currentCommand == null ? 0 : _viewModels.IndexOf (_currentCommand) - 1; 
      if (nextViewId < 0) { 
       return new MvxCommand (() => ShowViewModel<MainMenuViewModel>()); 
      } else { 
       _currentCommand = _viewModels [nextViewId]; 
       return _currentCommand; 
      } 
     } 
    } 
} 

Увлеченные до этих элементов навигации

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res/foo" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <Button 
     android:text="Previous" 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:id="@+id/btn_previous" 
     local:MvxBind="Click PreviousCommand" /> 
    <Button 
     android:text="Cancel" 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:id="@+id/btn_cancel" 
     local:MvxBind="Click CancelCommand" /> 
    <Button 
     android:text="Next" 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:id="@+id/btn_next" 
     local:MvxBind="Click NextCommand" /> 
</LinearLayout> 

навигации в фрагменте, и он используется для переключения других фрагментов из framelayout. Переключение фрагментов отлично работает, но только продвигает один фрагмент, независимо от того, сколько раз нажимается кнопка.

Мое предположение было бы, если бы я загрузил представление и нажал кнопку «Отмена», null будет возвращен. Однако возвращается DatePickerViewModel. Фактически, независимо от того, что я нажимаю, DatePickerViewModel всегда возвращается из CancelCommand. Однако, если я нажму NextCommand, FooReasonViewModel вернется, как ожидалось. Я очень смущен тем, что _currentCommand не может иметь сеттеров и быть приватным (поэтому его можно модифицировать только в моем FooNavigationViewModel) и возвращаться с одним значением, а затем сразу иметь другое значение. Я предполагаю, что что-то странное происходит с отражением и MVVMCross, но на самом деле понятия не имею. Все, что я хочу сделать, это иметь модель представления, которая позволяет мне делать шаг вперед и назад между представлениями

ответ

0

Я действительно не следую вашему коду, но я думаю, что происходящее не имеет никакого отношения к размышлению, а просто о том, когда свойства команд оцениваются:

  • , когда ваше мнение впервые было показано, переплеты оцениваются и замковое события связаны со свойством ICommand значения
  • после того, что никогда не бывает RaisePropertyChanged так привязки никогда не перепроверены
  • поэтому события Click остаются привязанными к оригинальному pr operties.

Чтобы изменить это, вы могли бы назвать RaisePropertyChanged(() => NextCommand); RaisePropertyChanged(() => PreviousCommand); всякий раз, когда изменяется nextViewId

В качестве альтернативы, вы можете изменить ваши команды, так что логика происходит в их Action - например, что-то вроде:

public MvxCommand NextCommand { 
    get { 
     // this return is executed when the binding happens 
     return new MvxCommand(() => { 
      // this switch is executed when the Click happens 
      switch(nextViewId) { 
       case 0: 
        // ... 
       case 1: 
        // ... 
      } 
     }); 
    } 
} 
Смежные вопросы