2017-10-09 7 views
0

Est-il possible de faire référence à Viewmodels qui se trouve dans une bibliothèque de classes portable séparée et Views qui se trouvent dans une bibliothèque de classes portable différente?Reportez-vous à ViewModels et Views qui se trouvent dans un projet de bibliothèque de classes portable séparé.

Ma structure du projet est la suivante:

  • SampleApp (Portable) -> Vues -> SecondPage.xaml
  • SampleApp (Droid)
  • testvm (classe Library Project) -> ViewModels -> SecondPageViewModel

En App.cs, Je me suis inscrit à la page suivante Container.RegisterTypeForNavigation<SecondPage, TestVM.ViewModels.SecondPageViewModel>();

Il a navigué à SecondPage mais le constructeur, les méthodes d'interface INavigationAware n'ont pas été appelés et les liaisons mvvm n'ont pas fonctionné.

Alors je voulais essayer la solution comme expliqué ici Getting Started with Prism’s new ViewModelLocator

Je

substituée ConfigureViewModelLocator
protected override void ConfigureViewModelLocator() 
    { 
     base.ConfigureViewModelLocator(); 
     ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) => 
     { 
      var viewName = viewType.FullName; 
      var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName; 
      var viewModelName = String.Format(CultureInfo.InvariantCulture, "{0}ViewModel, {1}", viewName, viewAssemblyName); 
      return Type.GetType(viewModelName); 
     }); 
    } 

Mais comment je me réfère à l'assemblée où mes viewmodels sont situés?

+0

Lorsque vous essayez d'extraire le type de vue, qu'est-ce que 'viewName',' viewAssemblyName' et 'viewModelName'? Quel est le nom complet de votre assemblage de modèle de vue? – Haukinger

+0

@Haukinger ** viewName **: SampleApp.Views.SecondPage, ** viewAssemblyName **: SampleApp, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null, ** viewModelName **: SampleApp.Views.SecondPageViewModel, SampleApp, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null –

+0

@Haukinger Mon modèle de vue est situé dans la classe TestVM projet de bibliothèque, nom de l'assemblage "TestVM" –

Répondre

1

Vous pouvez bien sûr remplacer la configuration par défaut pour le fournisseur de position ViewModel. Une méthode plus simple et plus rapide consiste cependant à utiliser l'extension d'enregistrement View/ViewModel. Tout comme vous pouvez le faire:

Container.RegisterTypeForNavigation<ViewA>()

vous pouvez également faire:

Container.RegisterTypeForNavigation<ViewA,ViewAViewModel>()

La deuxième méthode supprime la nécessité de localiser le ViewModel par la réflexion qui peut fournir des performances légèrement meilleures. Comme vous fournissez le ViewModel, vous n'avez pas à vous soucier de l'assemblage du ViewModel ou si vous suivez les conventions appropriées.

1

En réponse à votre commentaire:

viewModelName: SampleApp.Views.SecondPageViewModel, SampleApp, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null

adapter var viewModelName = String.Format(CultureInfo.InvariantCulture, "{0}ViewModel, {1}", viewName, viewAssemblyName); afin qu'il produit le nom de votre modèle réelle vue:

TestVM.ViewModels.SecondPageViewModel, TestVM, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

Quelque chose le long les lignes de

var viewModelName = $"{viewName.Replace("SampleApp","TestVM")}ViewModel, {viewAssemblyName.Replace("SampleApp","TestVM").Replace("Views","ViewModels")}";