2013-11-21 3 views
0

저는 MVVMCross를 Xamarin과 함께 사용하여 Android 앱을 개발 중입니다. 나는 개인 변수 _currentCommand를 가지고 있는데, 이는 예상했던대로 속성 내에서 수정되지 않는다. 는 I이 뷰 모델이 이러한 탐색에 매여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가 setter를 가질 수없고 프라이빗 (그래서 내 FooNavigationViewModel 내에서만 수정 될 수 있어야 함)하는 방법에 대해 혼란스러워하고, 하나의 값으로 리턴 된 다음 즉시 다른 값을 갖는다. 리플렉션과 MVVMCross로 이상한 일이 일어나고 있다고 생각하지만 실제로는 전혀 모른다. 내가하고 싶은 것은 뷰 사이를 앞뒤로 움직일 수있는 뷰 모델입니다.

답변

0

코드를 실제로 따르지는 않지만 리플렉션과는 아무 관련이 없지만 간단하게 명령 특성 평가됩니다

    보기를 처음 표시 될 때, 바인딩 평가하고 클릭 이벤트가 ICommand의 속성에 바인딩 때문에 바인딩이 재평가되지 않습니다 어떤 RaisePropertyChanged이 결코 후 것을
  • Click 이벤트는 원래의 pr 오티스. 예를 들어, - nextViewId은 또한

    을 변경할 때마다

이를 변경하려면 논리가 Action 내에서 발생 있도록 당신이 당신의 명령을 변경할 수 RaisePropertyChanged(() => NextCommand); RaisePropertyChanged(() => PreviousCommand); 부를 수 예 :

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: 
        // ... 
      } 
     }); 
    } 
} 
관련 문제