如何在LightMvvm中使用构造函数注入注册ViewModel Xamarin.Forms?
问题描述:
正如标题所写,我有我的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提前收到任何反馈意见。
答
我刚刚解决了这个问题。我几乎做错了所有事情,但现在它运行良好。如果有人感兴趣这应该看起来如何正确(我猜..)我可以发布此问题的工作代码。
顺便说一句:我怎么能设置这个问题解决?我可以做这样的事吗? –