繁体   English   中英

MVVMCross 如何在后面的视图代码中获取 ViewModel 实例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM