从视图模型中获取结果的标准Mvvm问题。
MvvmCross v5的导航服务为此带来了一些不错的解决方案,但我在实践中遇到了麻烦。将它与Xamarin-forms一起使用并测试android。
设置是一个主视图,带有一个带有命令绑定的按钮,该按钮调用从列表中返回值的第二个视图。
https://www.mvvmcross.com/documentation/fundamentals/navigation
此页面建议使用此系统调用新视图并指定返回类型/值的新系统:
var result = await _navigationService.Navigate<NewViewModelType, Paramtype, ResultType>(param);
哪个很好用,然后在NewViewModelType中返回它(当前)说:
await _navigationService.Close(this, new ResultType()); // this overload isn't there in 5.1
超载并不存在,但您可以使用MvxViewModel基础的Close方法(如果有人遇到此问题):
await Close(new ResultType());
在使用此命令关闭时,在Android模拟器中进行测试时效果很好
但是,如果您使用后退按钮离开新视图模型,原始按钮将显示为灰色,并且我们从未在主视图中收到返回值。
我希望能够按回去取消,但是按钮被禁用/等待左挂是一个问题。
那我应该怎么处理呢。有没有一种很好的方法来返回导航默认值?或者是否有一种干净的方法来拦截后退命令并返回默认值/ null?
-
以下是我的实际绑定和相关功能,以防我做了明显愚蠢的事情。这里的操作员是个人,而不是编程操作员。 查看绑定
<Button Text="{res:Translate Operator}" Command="{Binding SelectOperatorCommand}" />
查看模型按钮命令
public IMvxCommand SelectOperatorCommand =>
new MvxAsyncCommand(async () =>
{
var result = await _navigationService.Navigate<OperatorSelectViewModel, Operator, Operator>(_Operator);
Operator = result; // we never get here if you press back in the next view
});
第二个View模型(从列表中选择)init和close命令
public override Task Initialize(Operator parameter)
{
_selectedOperator = parameter;
return base.Initialize();
}
public IMvxAsyncCommand CloseCommand =>
new MvxAsyncCommand(async () =>
{
await Close(_selectedOperator);
// everything is happy is we exit this way.
});