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.事前にフィードバックをお願いします。
私はこの問題を解決するためにどのように設定できますか?そんなことはできますか? –