2010-11-22 10 views
2

Ich lerne Prisma V4 mit MEF, um meine Module zu laden. Laden von Modulen funktioniert, aber in einem Modul möchte ich ein View/ViewModel (MVVM) laden und weiß nicht wirklich, wie ich MEF bekomme, um all diese Sachen für mich aufzulösen.Ich denke an MEF: wie wird View (Model) geladen?

Erstens: Wie muss ich das ViewModel markieren (ich folge dem Beispiel von StockTraderRI), damit es beim Start nicht geladen wird, sondern während der Laufzeit in eine Region geladen werden kann?

Zweitens: Wie lade ich das ViewModel mit MEF, damit es mit den entsprechenden Schnittstellen verbunden wird?

MEF macht das sehr gut für Dinge beim Start, die als [Export] markiert sind, aber ich wusste nicht, wie ich dies während der Laufzeit erreichen soll.

Antwort

2

Sie können eine so genannte Lazy Export verwenden, sodass die Schnittstelle nicht aufgelöst wird, bis Sie sie explizit verwenden.


Wenn Sie mehrere Instanzen erstellen müssen, ist MEF dies nicht besonders gut unterstützen. Sie können entweder Ihre eigene Entdeckung und Instanziierung, oder Sie können den Export wie folgt definieren:

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

Der Nachteil ist, dass jetzt, wo Sie die Instanz erstellen müssen, benötigen Sie einen Hinweis auf die tatsächliche Container-Instanz haben . Dann können Sie tun:

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

EDIT: Okay, ich glaube, ich besser verstehen, was Sie nach. Hier ist, wie ich in der Regel dieses Problem behoben haben:

  1. ich meine Ansicht Objekte als Instanzen Usercontrol implementieren und setzen keine Datacontext überall in ihrem Code oder XAML.

  2. Ich erstelle ein DataTemplate, das vom Type des ViewModel an das UserControl bindet.

  3. Auf meinem MainViewModel (oder was auch immer zu der Ansicht entspricht die Regionen Hosting), belichten ich eine allgemeine Umgebungx Object (möglicherweise auf eine Schnittstelle eingegeben, wenn alle meine Viewmodel werden einige gemeinsame Funktionalität teilen, aber Object funktioniert gut).

  4. Ich erstelle einen ContentPresenter mit Inhalt, der an die RegionX-Eigenschaft gebunden ist.

  5. Jetzt kann mein MainViewModel verschiedene ViewModel-Instanzen importieren, die den Typen von ViewModels entsprechen, die von der RegionX gehostet werden. Wenn ich die 'aktive' Ansicht in der Region wechseln möchte, setze ich einfach RegionX auf das entsprechende ViewModel.

+0

ich mehr war für so etwas wie MefMagic.Create suchen, die die MyView benötigt schaffen würde? – Sam

+0

Möchten Sie mehrere Instanzen desselben Typs erstellen? –

+0

Nein (zumindest noch nicht). Das View/ViewModel sollte erstellt und irgendwie zusammengeschweißt werden. – Sam