Hallo,
ich beschäftige mich seit kurzem mit MEF und PRISM.
Mein Ziel ist es, für die Exportierten Views auto. das ViewModel zu discovern und in die View zu injected.
Im BootStrapper für die Shell sieht das bei mir momentan so aus (MainWindow und MainWindowViewModel haben jeweils das Export Attribut gesetzt.):
protected override void ConfigureAggregateCatalog()
{
RegistrationBuilder registrationBuilder = new RegistrationBuilder();
//inject the mainwindowviewmodel into the datacontext property
registrationBuilder.ForType<MainWindow>().ImportProperty<MainWindowViewModel>(p => p.DataContext);
//add current assembly to catalog
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly, registrationBuilder));
}
Die Applikationsmodule befinden sich in eigenen Assemblies und beinhalten die Views (UserControls) und ViewModels. Das hat zur Folge, dass ich im Projekt in dem sich die Shell befindet keine Projektreferenzen auf die Module habe und kein Import auf den DataContext setzen kann weil der Modul Typ nicht bekannt ist.
Im Prinzip möchte ich für alle Exportierte Views (in den Assemblie Modulen) folgendes ausführen
registrationBuilder.ForType<View>().ImportProperty<ViewModel>(p => p.DataContext);
Meine Namenskonventionen sehen es so vor, dass die ViewModels sich aus "Viewnamen" + "ViewModel" zusammensetzen. Falls das in irgendeiner weise helfen sollte.
Wäre es möglich in einem eigenen erstellten Export Attribut als Parameter das zu importierende ViewModel anzugeben, dass dann die ImportProperty() Methode ausführt? Aber dazu fehlt mir ja dann wieder der CompositeContainer.
Wie kann ich das Problem lösen?
Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp
Hey,
das manuelle setzen des DataContext via MEF ist mit PRISM nicht notwendig. Verwende
prism:ViewModelLocator.AutoWireViewModel="True"
siehe auch Using the ViewModelLocator class to connect view models to views