如何使用 Xamarin.Forms.DependencyService 注入具有构造函数注入的 ViewModel

Posted

技术标签:

【中文标题】如何使用 Xamarin.Forms.DependencyService 注入具有构造函数注入的 ViewModel【英文标题】:How to inject a ViewModel that has constructor injection with Xamarin.Forms.DependencyService 【发布时间】:2021-12-23 18:52:29 【问题描述】:

我像这样注册了我的视图模型和 DialogMessage 服务:

public App()
    
        InitializeComponent();

        DependencyService.Register<IDialogMessage, DialogMessage>();
        DependencyService.Register<SignInViewModel>();

        MainPage = new AppShell();
    

SignInViewModel 的构造函数中注入了 DialogMessage 服务

public SignInViewModel(IDialogMessage dialogMessage)
    
       _dialogMessage = dialogMessage;
    

现在,我想通过注入将 SignInViewModel 设置为 SignInView 的绑定上下文在其代码后面的类中:

public SignInPage()
    
        InitializeComponent();
        BindingContext = DependencyService.Resolve<SignInViewModel>();
    

然而,这会导致以下异常:

在 System.RuntimeType.CreateInstanceMono 中找不到类型 AppName.ViewModels.SignInViewModel 的默认构造函数(System.Boolean nonPublic,System.Boolean wrapExceptions

如何将 SignInViewModel 注入到绑定上下文以及将 DialogMessage 服务注入到 SignInViewModel?

【问题讨论】:

我认为 Xamarin.Forms 本身不提供依赖构造函数,因此您需要修改构造函数以接受 0 参数并使用 DependencyService 解决依赖关系 继续该评论:添加无参数构造函数后,代码将类似于var vm = DependencyService.Resolve&lt;SignInViewModel&gt;(); vm.DialogMessage = dialogMessage; BindingContext = vm; 您将必须提出适当的“dialogMessage”,这对于传递给该虚拟机是有意义的。 【参考方案1】:

查看MSDN 上的此页面,了解您需要在视图中注册视图模型的数据绑定

来自 MSDN 网站的类似内容:

【讨论】:

如果这么简单,OP 可以简单地在他们的 c# 代码中添加参数。问题不在于将参数传递给绑定上下文;它将参数传递给依赖服务引用。 AFAIK,这个答案与问题无关。

以上是关于如何使用 Xamarin.Forms.DependencyService 注入具有构造函数注入的 ViewModel的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?