2017-02-18 12 views
1

タイトルに書かれているように、私はXamarin.FormsのMvvmLightアプリケーションに問題があります。 私は、私の典型的なViewModel用のコードを持っています。LightMvvm Xamarin.Formsで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; } 
} 

これは、注入されたオブジェクトを解決できないことを登録私のViewModelと、ここで間違っている何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.事前にフィードバックをお願いします。

答えて

0

私はこれを解決しました。私はほとんどすべてが間違っていたが、今はうまくいっている。もし誰かがこれが正しく見えるように興味があれば(私は推測します)、私はこの問題の作業コードを投稿することができます。

+0

私はこの問題を解決するためにどのように設定できますか?そんなことはできますか? –

関連する問題