使用MvvmCross实现视图模型的条件表示的方法是什么?

时间:2018-06-06 12:27:48

标签: xamarin.forms xamarin.ios xamarin.android mvvmcross

我有一个登录viewmodel(带有相应的页面)。 在这种特殊情况下,我使用的是Xamarin.Forms。

我需要的是登录视图作为可以使用[MvxModalPresentationAttribute]注释的视图显示为导航堆栈的公共视图。

我在两种情况下展示了这个观点:

  • 应用启动且用户未登录时显示的第一个视图(并且无需登录即可继续工作);
  • 在应用程序工作期间(如果用户未登录),但用户请求了一些功能,这需要先登录。

我想,Custom Presenter是实现这一目标的方式,就像这样(对于iOS,例如):

public class GeneralPresenter : MvxIosViewPresenter
{
    public override void Show(MvxViewModelRequest request)
    {
        // ...

        base.Show(request);
    }
}

但是,我并没有完全遵循下一步应该做的事情。 (特别是,如果有关于Xamarin的任何具体内容。也应该进行表格。)

任何提示?

1 个答案:

答案 0 :(得分:1)

在Mvvmcross.core 5.7.0上,如果您想在iOS上呈现具有模态样式的视图,可以在视图中添加MvxModalPresentation属性:

[MvxModalPresentation(
        // Add this to modify the present view's style
        //ModalPresentationStyle = UIModalPresentationStyle.PageSheet,
        //ModalTransitionStyle = UIModalTransitionStyle.CoverVertical
    )]
public class SecondView : MvxViewController
{
    ...
}

然后呈现此视图的方式与push相同:

private readonly Lazy<IMvxNavigationService> _navigationService = new Lazy<IMvxNavigationService>(Mvx.Resolve<IMvxNavigationService>);
async private void ExecuteCommand()
{
    await _navigationService.Value.Navigate<SecondViewModel>();
}

最后解雇这个观点应该是:

async private void ExecuteCommand()
{
    await _navigationService.Value.Close(this);
}

更新

将Mvvmcross更新为6.0.1.0后,我们可以使用IMvxOverridePresentationAttribute界面来定义视图的演示样式。使视图实现界面:

public class SecondView : MvxViewController<SecondViewModel>, IMvxOverridePresentationAttribute
{
    ...
    public MvxBasePresentationAttribute PresentationAttribute(MvxViewModelRequest request)
    {
        var instanceRequest = request as MvxViewModelInstanceRequest;
        SecondViewModel viewModel = instanceRequest?.ViewModelInstance as SecondViewModel;

        if (viewModel.IsModalView)
        {
            return new MvxModalPresentationAttribute();
        }
        return new MvxChildPresentationAttribute();
    }
    ...
}

IsModalView在我的ViewModel中定义。当我们想要呈现视图时,使用它来修改样式:

public class SecondViewModel : MvxViewModel<bool>
{
    ...
    public override void Prepare(bool parameter)
    {
        IsModalView = parameter;
    }
    public bool IsModalView { set; get; }
    ...
}
// The navigate method
await _navigationService.Value.Navigate<SecondViewModel, bool>(false);