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

时间:2017-02-18 13:57:11

标签: c# xamarin 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提前获得任何反馈。

1 个答案:

答案 0 :(得分:0)

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