
[英]How to pass data from ViewModel to View code behind in Xamarin.Forms following MVVM?
[英]MVVMCross How to get ViewModel Instance within View Code Behind
我正在使用 MVVMCross 7.1.2 并且遇到我的几个页面无法继承MvxContentPage
类的情况。 可以理解,这破坏了 MVVMCross 实现的一些东西。
我注意到的一件事是页面的BindingContext
没有设置,因此我们得到了一个难以调试的 NullReference 异常。
从后面的视图代码中访问 ViewModel 实例的最佳方法是什么? 目前我正在使用接口IMvxOverridePresentationAttribute
然后像这样实现它:
public MvxBasePresentationAttribute PresentationAttribute(MvxViewModelRequest request)
{
BindingContext = ((MvxViewModelInstanceRequest) request).ViewModelInstance;
InitializeComponent(); <--- Update 1,moved from ctor
return null;
}
这是获取 VM 实例的最佳方式吗? 或者有更好的BindingContext
自动设置。
更新 1; 我仍然使用此方法获得NullReference
异常,大概是因为它在调用InitializeComponent
后设置了BindingContext
。 我尝试在设置BindingContext
后将InitializeComponent
调用移动到,但页面未正确呈现。
你有没有尝试过这样的事情?
public partial class SomeView : ContenPage
{
public ViewModels.NestedViewModel ViewModel {get; set;}
public SomeView()
{
InitializeComponent();
// when viewmodel already created
if (Mvx.IoCProvider.TryResolve<ViewModels.NestedViewModel>(out var someViewModel))
{
ViewModel = someViewModel;
BindingContext = ViewModel;
return;
}
// creating viewmodel
var _viewModelLoader = Mvx.IoCProvider.Resolve<IMvxViewModelLoader>();
var request = new MvxViewModelInstanceRequest(typeof(ViewModels.NestedViewModel));
request.ViewModelInstance = _viewModelLoader.LoadViewModel(request, null);
ViewModel = request.ViewModelInstance as ViewModels.NestedViewModel;
BindingContext = ViewModel;
Mvx.IoCProvider.RegisterSingleton<ViewModels.NestedViewModel>(ViewModel);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.