Я начинаю использовать MVVMLight с Xamarin.Forms, и мне нужна помощь, чтобы настроить IOC для создания моего первого ContentPage в App.GetMainPage.
Мои ViewModels имеют такие конструкторы -
public class NewsType1ViewModel : ViewModelBase
{
private readonly IContentService contentService;
private readonly INavigation navigation;
public List<ContentModel> ContentModels { get; set; }
public NewsType1ViewModel (INavigation navigation, IContentService contentService)
{
this.contentService = contentService;
this.navigation = navigation;
}
Мои ContentPages имеют такие конструкторы -
public partial class NewsType1CP : ContentPage
{
private NewsType1ViewModel vm;
public NewsType1CP (NewsType1ViewModel vm)
{
InitializeComponent ();
Я использую класс ViewModelLocator следующим образом:
public class ViewModelLocator
{
public ViewModelLocator ()
{
ServiceLocator.SetLocatorProvider (() => SimpleIoc.Default);
// Services
if (App.StubMode) {
SimpleIoc.Default.Register<IContentService, ContentServiceStub> ();
} else {
SimpleIoc.Default.Register<IContentService, ContentService> ();
}
// How do I wire up INavigation?
// I could not just register default NavigationPage() as it has 2
// possible constructors so tried [PreferredConstructor] on my derived class
SimpleIoc.Default.Register<INavigation, AppNavigationPage> ();
// View Models
SimpleIoc.Default.Register<NewsType1ViewModel> ();
SimpleIoc.Default.Register<NewsDetailsViewModel> ();
}
public NewsType1ViewModel NewsType1ViewModel {
get {
return ServiceLocator.Current.GetInstance<NewsType1ViewModel> ();
}
}
public NewsDetailsViewModel NewsDetailsViewModel {
get {
return ServiceLocator.Current.GetInstance<NewsDetailsViewModel> ();
}
}
public static void Cleanup ()
{
// TODO Clear the ViewModels
}
}
public class AppNavigationPage : NavigationPage
{
[PreferredConstructor]
public AppNavigationPage ()
{
}
}
Мой App.cs выполняется следующим образом:
public static class App
{
public static AppNavigationPage Nav;
public static ViewModelLocator Locator = new ViewModelLocator ();
public static bool StubMode = true;
public static Page GetMainPage ()
{
try {
// Want to return a Nav with NewsType1CP as the starting Page
NewsType1CP newsType1CP = new NewsType1CP(ServiceLocator.Current.GetInstance<NewsType1ViewModel> ());
Nav.PushAsync (newsType1CP);
return Nav;
} catch (Exception ex) {
//
Exception baseexception = ex.GetBaseException ();
Debug.WriteLine (baseexception.Message);
}
return null;
}
}
Мое последнее исключение -
Невозможно преобразовать тип источника в тип назначения.
Я лаю не по тому дереву, пытаясь предоставить INavigation для каждой из моих ViewModels?
Обновление: после нескольких ответов, показывающих другие способы управления навигацией в Xamarin Forms, я думаю, было бы полезно, если бы кто-то мог объяснить, почему попытка внедрения конструктора для навигации не такая уж хорошая вещь.
Я думаю, что мой пример немного сбивает с толку AppNavigationPage как статический, в идеале я хотел бы, чтобы он также был в IOC, поэтому я мог бы просто вызвать return ServiceLocator.Current.GetInstance‹ AppNavigationPage >(), но я попробовал различные фабричные методы, и я занимаюсь их отладкой, поэтому код явно наполовину испечен...