如何使用 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<SignInViewModel>(); vm.DialogMessage = dialogMessage; BindingContext = vm;
您将必须提出适当的“dialogMessage”,这对于传递给该虚拟机是有意义的。
【参考方案1】:
查看MSDN 上的此页面,了解您需要在视图中注册视图模型的数据绑定
来自 MSDN 网站的类似内容:
【讨论】:
如果这么简单,OP 可以简单地在他们的 c# 代码中添加参数。问题不在于将参数传递给绑定上下文;它将参数传递给依赖服务引用。 AFAIK,这个答案与问题无关。以上是关于如何使用 Xamarin.Forms.DependencyService 注入具有构造函数注入的 ViewModel的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?