MvvmCross私有变量没有改变价值

时间:2013-11-21 14:41:54

标签: c# android xamarin mvvmcross

我正在使用MVVMCross与Xamarin开发Android应用程序。我有一个私有变量_currentCommand,没有像我期望的那样在属性中进行修改。 我有这个ViewModel:

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,但实在不知道。我想做的就是拥有一个视图模型,让我在视图之间前进和后退

1 个答案:

答案 0 :(得分:0)

我并不真正关注你的代码,但我认为发生的事情与反射无关,而只是在评估Command属性时:

  • 首次显示视图时,将评估绑定并将Click事件绑定到ICommand属性值
  • 之后永远不会有RaisePropertyChanged所以绑定永远不会被重新评估
  • 因此Click事件将保持与原始属性绑定。

要更改此设置,只要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:
                  // ...
           }
         });
    }
}