xamarin 表单 mvvm 缺少默认构造函数

问题描述

我已经创建了一个 MessageCenterService 接口

public interface IDialogService
{
    Task Toasting(string title);
}

public class DialogService : IDialogService
{
    public async Task Toasting(string title)
    {
        using (var Dialog = UserDialogs.Instance.Toast(title,null))    
        {
            await Task.Delay(1000);
        }
    }
}   

现在我正在尝试依赖注入但是:

public class Loginviewmodel : Baseviewmodel
{
    private IDialogService _dialogService;

    public ICommand LoginCommand { get; set; }

    public Loginviewmodel(IDialogService dialogService)
    {
        _dialogService = dialogService;
        LoginCommand = new Command(Login);  
    }
}   

Erro => 缺少“..Loginviewmodel”的认构造函数

登录页面.xaml

  <ContentPage.BindingContext>
        <viewmodels:Loginviewmodel/>
  </ContentPage.BindingContext>

但是如果我把:

public Loginviewmodel(){}

public Loginviewmodel(IDialogService dialogService) //:Base() :this
{
    _dialogService = dialogService;
    ...
}

错误消失但IDialogService永远不会被实例化_dialogService总是为空

LoginPage.xaml.cs 更改也不起作用..

public LoginPage()
{
    InitializeComponent();
}

public LoginPage(IDialogService dialogService): base()
{
    InitializeComponent();
}

我错过了什么?提前致谢

https://forums.xamarin.com/discussion/48009/pop-display-alert-message-from-viewmodel Missing Default Constructor error in Xamarin Forms Xamarin Forms -> System.MissingMethodException: Default constructor not found for [Interface] Missing Default Constructor error in Xamarin Forms

解决方法

尝试使用 DependencyService 或像 TinyIOC 这样的 3rd 方库。 这是我使用 DependencyService 的示例代码。 您可以使用 DependencyService.Register() 注册您的服务,然后使用 DependencyService.Get();

简单地调用它

App.xaml.cs

public App()
{
   ...
   DependencyService.Register<DialogService>();
   ...
}

登录页面.xaml.cs

LoginPage()
{
   InitializeComponent();
   BindingContext = new LoginViewModel();
}

登录ViewModel.cs

private IDialogService _dialogService;

public LoginViewModel()
{
   ...
   _dialogService = DependencyService.Get<DialogService>();;
   ...
}
,

试试private readonly IDialogService _dialogService;