2010-11-22 21 views
2

J'apprends le prisme V4 en utilisant MEF pour charger mes modules. Le chargement des modules fonctionne, mais dans un module, je veux charger un View/ViewModel (MVVM) et je ne sais pas vraiment comment obtenir MEF pour résoudre tout ça pour moi. Premièrement, comment dois-je marquer le ViewModel (je suis l'exemple de StockTraderRI) pour qu'il ne soit pas chargé au démarrage mais puisse être chargé au cours de l'exécution dans une région? Deuxièmement: comment charger le ViewModel en utilisant MEF afin qu'il se connecte aux interfaces correspondantes? MEF le fait très bien pour les choses au démarrage qui sont marquées comme [Export], mais je ne savais pas comment y parvenir pendant l'exécution.Envelopper mon esprit autour de MEF: comment charger View (Model)?

Répondre

2

Vous pouvez utiliser ce que l'on appelle un Lazy Export afin que l'interface ne soit pas résolue tant que vous ne l'utilisez pas explicitement.


Si vous devez créer plusieurs instances, MEF ne le supporte pas particulièrement bien. Vous pouvez faire votre propre découverte et instanciation, ou vous pouvez définir l'exportation comme ceci:

[PartCreationPolicy(CreationPolicy.NonShared)] 
[Export(typeof(ISomething)] 
public class Something : ISomething { } 

L'inconvénient est que maintenant où vous devez créer l'instance, vous devez avoir une référence à l'instance de conteneur réelle . Ensuite, vous pouvez faire:

var something = _container.GetExportedObject<ISomething>(); 

EDIT: D'accord, je pense que je comprends mieux ce que vous êtes après. Voici comment je suis généralement résolu ce problème:

  1. je mets en œuvre mon point de vue des objets comme des instances UserControl et ne fixe pas DataContext partout dans leur code ou XAML.

  2. Je crée un DataTemplate qui se lie du type du ViewModel au UserControl. Sur mon MainViewModel (ou tout ce qui correspond à la vue qui héberge les régions), j'expose un objet RegionX général (éventuellement tapé sur une interface si tous mes ViewModels partagent certaines fonctionnalités communes, mais Object fonctionne bien).

  3. Je crée un ContentPresenter avec du contenu lié à la propriété RegionX. Maintenant, mon modèle MainViewModel peut importer différentes instances de ViewModel correspondant aux types de ViewModels qui pourraient être hébergés par le RegionX. Quand je veux changer la vue 'active' dans la région, je place simplement RegionX dans le ViewModel correspondant.

+0

je cherchais quelque chose de plus comme MefMagic.Create qui créeraient la MyView nécessaire? – Sam

+0

Cherchez-vous à créer plusieurs instances du même type? –

+0

Non (du moins pas encore). Le View/ViewModel doit être créé et soudé ensemble. – Sam