【问题标题】:How to inject a ViewModel that has constructor injection with Xamarin.Forms.DependencyService如何使用 Xamarin.Forms.DependencyService 注入具有构造函数注入的 ViewModel
【发布时间】: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”,这对于传递给该虚拟机是有意义的。

标签: c# xamarin xamarin.forms dependency-injection


【解决方案1】:

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

来自 MSDN 网站的类似内容:

【讨论】:

  • 如果这么简单,OP 可以简单地在他们的 c# 代码中添加参数。问题不在于将参数传递给绑定上下文;它将参数传递给依赖服务引用。 AFAIK,这个答案与问题无关。
猜你喜欢
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多