Я пытаюсь создать простое модульное приложение MVVM с MEF. У меня есть класс ViewModel и UserControl как вид. Я подключить два через DataTemplate, как это:ViewModel сгенерирован дважды с помощью MEF
<DataTemplate DataType="{x:Type local:MyViewModel}">
<local:MyView />
</DataTemplate>
В представлении, я определяю ViewModel как StaticResource, чтобы сделать привязку просто:
<UserControl.Resources>
<local:MyViewModel x:Key="ViewModel" />
</UserControl.Resources>
Тогда я связываю так:
<Grid DataContext="{StaticResource ResourceKey=ViewModel}">
<TextBlock Text="{Binding Text}" />
</Grid>
Все это работает без MEF. Однако, поскольку я нацелен на модульность, я использую MEF для открытия моих классов ViewModel. У меня есть атрибут экспорта на мой ViewModel класс:
[Export(typeof(MyViewModel))]
public class MyViewModel
{
// ...
}
и я использую MEF динамически загружать ViewModel в раковину в App.xaml.cs:
private void Application_Startup(object sender, StartupEventArgs e)
{
var shell = new MainWindow();
var catalog = new AssemblyCatalog(this.GetType().Assembly);
var container = new CompositionContainer(catalog);
shell.Contents.ViewModel = container.GetExportedValues<MyViewModel>().First();
shell.Show();
}
Сейчас, на данный момент, MEF создает экземпляр моего ViewModel, когда он загружает vm, а мой вид создает другой экземпляр, когда он объявляет vm как ресурс. (Это легко проверить, установив точку останова в конструкторе.)
Вопрос в том, как передать экземпляр, созданный MEF, в мое объявление ресурса? Могу ли я объявить этот конкретный экземпляр ресурсом?
DropBox ссылку с полным кодом: https://www.dropbox.com/sh/pbdl029d26sx7gl/AAA6po50dLjbJSoNPBhCyWZ3a?dl=0
Изменена моя инфраструктура, используя DataContextSpy на основе этого ответа: http://stackoverflow.com/a/5402653/5219911 Оставив вопрос открытым, на случай, если кто-то придумает другое увлечение, но это, похоже, работает в данный момент. –