Le projet (WPF) contient ces dossiers:

  • Vues
  • AfficherModèles
  • Sous-vues
  • SubViewModels

Comment faire travailler les ViewModelLocator du Prism avec eux (Views & gt; ViewModels & amp; SubViews & gt; SubViewModels), la solution que j'ai trouvée ne fonctionne qu'avec une seule convention:

protected override void ConfigureViewModelLocator()
{
    base.ConfigureViewModelLocator();

    ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
    {
        var viewName = viewType.FullName.Replace(".ViewModels.", ".CustomNamespace.");
        var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
        var viewModelName = $"{viewName}ViewModel, {viewAssemblyName}";
        return Type.GetType(viewModelName);
    });
}
0
mshwf 18 sept. 2020 à 14:36

2 réponses

Meilleure réponse

Je l'ai résolu en vérifiant le viewType et en fonction de celui-ci, je renvoie le type de ViewModel approprié:

protected override void ConfigureViewModelLocator()
{
    base.ConfigureViewModelLocator();

    ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
    {
        string prefix;
        if (viewType.FullName.Contains(".SubViews."))
        {
            prefix = viewType.FullName.Replace(".SubViews.", ".SubViewModels.");
        }
        else
        {
            prefix = viewType.FullName.Replace(".Views.", ".ViewModels.");
        }
        var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
        var viewModelName = $"{prefix}ViewModel, {viewAssemblyName}";
        return Type.GetType(viewModelName);
    });
}
0
mshwf 18 sept. 2020 à 12:46

Vous pouvez opter pour l'enregistrement des paires (pas aussi mauvais que cela puisse paraître car vous devez de toute façon vous inscrire pour la navigation).

Vous pouvez également implémenter les deux conventions l'une après l'autre - prenez le nom de la vue, soustrayez "Vues" et ajoutez "ViewModels" et essayez d'obtenir le type du modèle de vue. Si cela échoue, soustrayez "SubViews" et ajoutez "SubViewModels" et réessayez. Vous pouvez même vérifier les combinaisons croisées (par exemple "SubViews.ViewA" et "ViewModels.ViewAViewModel") ...

0
Haukinger 18 sept. 2020 à 11:51