2012-09-20 19 views
13

Właśnie uczę się WPF i Caliburn.Micro. Postępuję zgodnie z przedstawionym tutaj kodem: http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper&referringTitle=DocumentationCaliburn.Micro i MEF na wpf

Podobno ten kod jest przeznaczony dla Silverlight, ale mój projekt jest WPF iz tego powodu otrzymuję błąd, że CompositionHost nie jest zdefiniowany.

W dokumencie stwierdzono, że muszę zainicjować kontener bezpośrednio w wpf, ale nie ma dokumentu, który wskazywałby, w jaki sposób. Jak mogę zainicjować kontener bezpośrednio?

Edycja 1 byczek rozruchowy jest podobny do tego w dokumentacji:

 container = CompositionHost.Initialize(
     new AggregateCatalog(
      AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>() 
      ) 
     ); 

    var batch = new CompositionBatch(); 

    batch.AddExportedValue<IWindowManager>(new WindowManager()); 
    batch.AddExportedValue<IEventAggregator>(new EventAggregator()); 
    batch.AddExportedValue(container); 

    container.Compose(batch); 

i przekształcono go:

var catalog = 
      new AggregateCatalog(
       AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()); 

     this.container = new CompositionContainer(catalog); 
     var batch = new CompositionBatch(); 

     batch.AddExportedValue<IWindowManager>(new WindowManager()); 
     batch.AddExportedValue<IEventAggregator>(new EventAggregator()); 
     batch.AddExportedValue(this.container); 

     this.container.Compose(batch); 

Ale kiedy uruchomić aplikację, otrzymuję błąd, który MEF nie może znajdź implementację dla IShell

 Could not locate any instances of contract IShell. 

Uwierzę w moją inicjalizację M EF nie jest poprawne. Czy możesz mi pomóc to naprawić?

Odpowiedz

17

W WPF należy użyć jawnego konstruktora CompositionContainer. W moim WPF i Silverlight wspólną inicjującego Użyłem następujący #if - #else dyrektywy:

#if SILVERLIGHT 
    container = CompositionHost.Initialize(catalog); 
#else 
    container = new CompositionContainer(catalog); ; 
#endif 

EDIT

inicjującego będzie zidentyfikować składnik, który implementuje interfejs IShell (o ile Twój inicjującego rozszerza Bootstrapper<IShell> klasa podstawowa), więc musisz zaimplementować klasę dekorowaną eksportem MEF o wartości IShell.

Zazwyczaj będzie to Twój ShellViewModel i deklaracja będzie wyglądać następująco:

[Export(typeof(IShell))] 
public class ShellViewModel : PropertyChangedBase, IShell 
{ 
    ... 
} 

można przeczytać wiele więcej na temat konfiguracji programu inicjującego i dostosowywania here.

+0

Dzięki. Zobacz moją edycję do zadawania pytań. – mans

+0

@mans Proszę zobaczyć aktualizację mojej odpowiedzi. –

Powiązane problemy