2017-02-18 2 views
1

Как написано в названии, у меня проблема с моим приложением MvvmLight в Xamarin.Forms. У меня такой код для моего образцового ViewModel.Как зарегистрировать ViewModel с введением конструктора в LightMvvm 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, что он не может разрешить инъекционные объекты? Когда я запускаю этот код, он терпит неудачу, он работает, когда я добавляю конструктор без параметров, поэтому я предполагаю, что ViewModel не создается должным образом с точки зрения инсталляции конструктора.

Если отсутствует какой-либо важный код, пожалуйста, дайте мне знать, я отправлю его.

T.Hanks заранее для любой обратной связи.

ответ

0

Я только что решил это. Я делал почти все неправильно, но теперь он работает хорошо. Если кому-то интересно, как это должно выглядеть правильно (я думаю ..), я могу опубликовать рабочий код для этой проблемы.

+0

BTW: Как я могу решить этот вопрос? Могу ли я это сделать? –

Смежные вопросы