Reputation: 18168
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?
Upvotes: 13
Views: 5771
Reputation: 15971
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.
Upvotes: 17