繁体   English   中英

如何在LightMvvm Xamarin.Forms中使用构造函数注入注册ViewModel?

[英]How to register ViewModel with constructor injection in LightMvvm Xamarin.Forms?

正如标题中所写,我在Xamarin.Forms下的MvvmLight应用程序有问题。 我有我的示例ViewModel的代码。

public interface IMainViewModel
{

}

public class MainViewModel : ViewModelBase, IMainViewModel
{
    private readonly IDataService<Todoo> _dataService;
    private readonly INavigationService _navigationService;

    public MainViewModel(IDataService<Todoo> dataService, INavigationService navigationService)
    {
        if (navigationService == null)
            throw new ArgumentNullException(nameof(navigationService), "Navigation service cannot be null");
        _navigationService = navigationService;

        if (dataService == null)
            throw new ArgumentNullException(nameof(dataService), "Data service cannot be null");
        _dataService = dataService;

        NavigationCommand = new RelayCommand<string>(parameter => Navigate(parameter));
    }

    private void Navigate(string parameter)
    {
        // _navigationService.NavigateTo(ViewModelLocator.MainPage, parameter ?? string.Empty);
        _navigationService.NavigateTo(ViewModelLocator.AddNewTodooPage);
    }

    public RelayCommand<string> NavigationCommand { get; private set; }
}

这是一个ViewModelLocator

public class ViewModelLocator
{
    public const string MainPage = "MainPage";
    public const string AddNewTodooPage = "AddNewTodooPage";

    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        SimpleIoc.Default.Register<IMainViewModel, MainViewModel>();
        SimpleIoc.Default.Register<IAddNewTodooViewModel, AddNewTodooViewModel>();
    }

    public MainViewModel Main => ServiceLocator.Current.GetInstance<MainViewModel>();
    public AddNewTodooViewModel AddNewTodoo => ServiceLocator.Current.GetInstance<AddNewTodooViewModel>();

    public static void Cleanup()
    {
        // TODO Clear the ViewModels
    }
}

和App.cs

public partial class App
{
    private static ViewModelLocator _locator;

    public static ViewModelLocator Locator => _locator ?? (_locator = new ViewModelLocator());

    public App()
    {
        SimpleIoc.Default.Register<IDataService<Todoo>>(() => new TodoosDataService());
        SimpleIoc.Default.Register<IRepository<Todoo>>(() => new FakeTodoosRepository());

        var nav = new NavigationService();

        nav.Configure(ViewModelLocator.MainPage, typeof(MainPage));
        nav.Configure(ViewModelLocator.AddNewTodooPage, typeof(AddNewTodooPage));

        SimpleIoc.Default.Register<INavigationService>(() => nav);

        var mainPage = new NavigationPage(new MainPage());

        nav.Initialize(mainPage);

        MainPage = mainPage;
    }

    public static Page GetMainPage()
    {
        return new MainPage();
    }

    public static Page GetAddNewTodooPage()
    {
        return new AddNewTodooPage();
    }
}

注册我的ViewModel有什么不对,它无法解析注入的对象? 当我运行此代码时它失败,它在我添加无参数构造函数时起作用,所以我假设ViewModel在构造函数注入方面没有正确创建。

如果缺少一些关键代码,请告诉我,我会发布。

T.Hanks提前获得任何反馈。

我刚解决了这个问题。 我几乎做错了什么,但现在它运作良好。 如果有人对这应该如何正确感兴趣(我猜...)我可以发布这个问题的工作代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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