Xamarin MvxViewController.PresentationAttribute在加载ViewModel之前调用
我对xamarin.ios和MvvmCross有问题,我需要显示一个MvxViewController,它有两种方式,具体取决于调用它的用户,我通过以下方式获得: CustomViewController: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
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
};
}