Caliburn.Micro and MEF on wpf

caliburn.micro, mef, wpf

Solution

In WPF you need to use an explicit `CompositionContainer` constructor. In my WPF and Silverlight shared bootstrapper I have used the following `#if`-`#else` directive:

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

EDIT

The bootstrapper will identify a component that implements the `IShell` interface (provided your bootstrapper is extending the `Bootstrapper<IShell>` base class), so you need to implement a class decorated with MEF export of `IShell`.

Typically this would be your `ShellViewModel` and the declaration would look like this:

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

You can read much more about bootstrapper setup and customization here.

Problem

I am just learning WPF and Caliburn.Micro. I am following the code that presented here: http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper&referringTitle=Documentation Apparently this code is for Silverlight but my project is a WPF and for this reason I am getting error that CompositionHost is not defined. The document stated that I need to initialize the container directly in wpf, but there is no document to show how. How can I initialize the container directly? Edit 1 The boot strapper is like this in documentation: ``` 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); ``` and I converted it to : ``` 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); ``` But when I run application, I am getting error that MEF can not find implementation for IShell ``` Could not locate any instances of contract IShell. ``` I belive my initialization of MEF is not correct. Can you please help me fix it?

Original source