我正在使用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,但实在不知道。我想做的就是拥有一个视图模型,让我在视图之间前进和后退
答案 0 :(得分:0)
我并不真正关注你的代码,但我认为发生的事情与反射无关,而只是在评估Command属性时:
RaisePropertyChanged
所以绑定永远不会被重新评估要更改此设置,只要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:
// ...
}
});
}
}