Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin MvxViewController.PresentationAttribute在加载ViewModel之前调用_Xamarin_Xamarin.ios_Mvvmcross - Fatal编程技术网

Xamarin MvxViewController.PresentationAttribute在加载ViewModel之前调用

Xamarin MvxViewController.PresentationAttribute在加载ViewModel之前调用,xamarin,xamarin.ios,mvvmcross,Xamarin,Xamarin.ios,Mvvmcross,我对xamarin.ios和MvvmCross有问题,我需要显示一个MvxViewController,它有两种方式,具体取决于调用它的用户,我通过以下方式获得: CustomViewController: public partial class CustomViewController : MvxViewController<CustomViewModel>, IMvxOverridePresentationAttribute { public CustomViewCo

我对xamarin.ios和MvvmCross有问题,我需要显示一个MvxViewController,它有两种方式,具体取决于调用它的用户,我通过以下方式获得:

CustomViewController:

public partial class CustomViewController : MvxViewController<CustomViewModel>, IMvxOverridePresentationAttribute
{

    public CustomViewController() : base("CustomViewController", null)
    {

    }

    public MvxBasePresentationAttribute PresentationAttribute()
    {

        if (ViewModel.KindNavigation) //Here's the issue
        {
            return new MvxSidebarPresentationAttribute(MvxPanelEnum.Center, MvxPanelHintType.ResetRoot, true, MvxSplitViewBehaviour.Detail);
        }
        else
        {
            return new MvxModalPresentationAttribute
            {
                ModalPresentationStyle = UIModalPresentationStyle.OverFullScreen,
                ModalTransitionStyle = UIModalTransitionStyle.CoverVertical
            };
        }
    }
}
公共部分类CustomViewController:MvxViewController,IMvxOverridePresentationAttribute
{
公共CustomViewController():基(“CustomViewController”,null)
{
}
公共MvxBasePresentationAttribute PresentationAttribute()
{
if(ViewModel.KindNavigation)//问题是
{
返回新的MvxSidebarPresentationAttribute(MvxPanelEnum.Center、MvxPanelHintType.ResetRoot、true、MvxSplitViewBehaviour.Detail);
}
其他的
{
返回新的MvxModalPresentationAttribute
{
ModalPresentationStyle=UIModalPresentationStyle.OverFullScreen,
ModalTransitionStyle=UIModalTransitionStyle.CoverVertical
};
}
}
}
如果我执行ViewModel.anything,则获取用于定义表示类型的参数ViewModel为null,我无法访问。我甚至没有打开它,因为这个视图的表示类型没有定义

CustomViewModel:

public class CustomViewModel : MvxViewModel<string>, IDisposable
{
    private readonly IMvxNavigationService _navigationService;

    public CustomViewModel(IMvxNavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    private bool _KindNavigation;
    public bool KindNavigation
    {
        get => _KindNavigation;
        set => SetProperty(ref _KindNavigation, value);
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    public override Task Initialize(string parameter)
    {
        KindNavigation = Convert.ToBoolean(parameter);
        System.Diagnostics.Debug.WriteLine("parameter: " + parameter);

        return base.Initialize();
    }
}
公共类CustomViewModel:MvxViewModel,IDisposable { 专用只读IMvxNavigationService\u navigationService; 公共CustomViewModel(IMvxNavigationService导航服务) { _导航服务=导航服务; } 私人楼宇导航; 公共布尔导航 { 获取=>\u导航; set=>SetProperty(ref\u,value); } 公共空间处置() { 抛出新的NotImplementedException(); } 公共覆盖任务初始化(字符串参数) { KindNavigation=Convert.ToBoolean(参数); System.Diagnostics.Debug.WriteLine(“参数:”+参数); 返回base.Initialize(); } }
这是MvvmCross中的一个限制,因为在加载视图之前不会加载ViewModel。文档中也描述了这一点:

要在运行时覆盖表示属性,可以在视图控制器中实现IMvxOverridePresentationAttribute,并在PresentationAttribute方法中确定表示属性,如下所示:

如果从PresentationAttribute返回null,iOS视图演示器将返回用于装饰视图控制器的属性。如果视图控制器未使用表示属性装饰,则它将使用默认的表示属性(动画子表示)

注意:请注意,在PresentationAttribute期间,您的ViewModel将为null,因此您可以在那里执行的逻辑在此受到限制。此限制的原因是MvvmCross演示者是无状态的,您无法将已实例化的ViewModel与新视图连接。


链接已断开,因此更新了链接,我在答案中添加了相关信息以供将来参考:)
public MvxBasePresentationAttribute PresentationAttribute()
{
    return new MvxModalPresentationAttribute
    {
        ModalPresentationStyle = UIModalPresentationStyle.OverFullScreen,
        ModalTransitionStyle = UIModalTransitionStyle.CrossDissolve
    };
}