MvvmCross Xamarin-Forms视图模型返回值和返回导航

时间:2017-08-20 14:49:01

标签: c# android xamarin xamarin.forms mvvmcross

从视图模型中获取结果的标准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.
        });

0 个答案:

没有答案