2017-02-18 41 views
1

正如标题所写,我有我的MvvmLight应用程序下Xamarin.Forms问题。 我有这样的代码为我的示例ViewModel。如何在LightMvvm中使用构造函数注入注册ViewModel Xamarin.Forms?

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没有在构造函数注入方面正确创建。

如果缺少一些关键代码,请让我知道,我会发布它。

T.Hanks提前收到任何反馈意见。

回答

0

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

+0

顺便说一句:我怎么能设置这个问题解决?我可以做这样的事吗? –