2015-09-28 4 views
1

Я пытаюсь создать простое модульное приложение 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

+0

Изменена моя инфраструктура, используя DataContextSpy на основе этого ответа: http://stackoverflow.com/a/5402653/5219911 Оставив вопрос открытым, на случай, если кто-то придумает другое увлечение, но это, похоже, работает в данный момент. –

ответ

0

Хорошо, так что я должен был сделать это.

У меня было два экземпляра, потому что, как только MEF создавал экземпляр ViewModels, когда он их импортировал, а затем в другой раз WPF создал их, когда он создал ресурс ViewModel. Я понял, что решение не будет напрямую создавать ресурс, но я понятия не имел, как я мог это сделать. Затем вместе пришли Injection ресурсов, а затем DataContextSpy, из этого вопроса здесь: https://stackoverflow.com/a/5402653/5219911

А вот прямая ссылка на тему: http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF

Я сейчас, используя ресурс, который является DataContextSpy, с помощью которого я могу обратитесь к экземпляру ViewModel, который используется при создании DataTemplate.

На мой взгляд, в ресурсах, я определяю , а затем я просто установить DataContext корневого элемента к данному ресурсу: DataContext = "{Binding Source = {StaticResource ResourceKey = ViewModel}, Path = DataContext}"

Теперь, к сожалению, я не получаю поддержку Intellisense только с этим, так как DataContextSpy является своего рода прокси-сервером для реального DataContext, поэтому мне нужно вручную настроить время создания типа DataContext, используя: d: DataContext = " {d: DesignInstance Type = viewModel: MyViewModel} "

0

Создание MyViewModel основывается исключительно на последовательности, как ваши выполнения программы, но вы можете установить CreationPolicy, чтобы сделать ваш экземпляр стать синглтон так, что и ваш код и ресурсы, ссылающиеся на один и тот же экземпляр.

[Export (TypeOf (MyViewModel)), PartCreationPolicy (CreationPolicy.Shared)]

Side Примечание: Для того, чтобы использовать MEF, Microsoft скрыть реализацию CompositionInitializer и CompositionHost из .Net Framework по некоторым причинам. Попробуйте google и импортируйте 2 класса из Microsoft вместо непосредственного использования CompositionContainer. У вас будет больше опыта в использовании MEF.

+0

Это, к сожалению, только говорит MEF, чтобы создать экземпляр моей модели просмотра только один раз. Проблема заключается в том, что как MEF, так и поиск ресурсов WPF пытаются создать экземпляр указанной модели viewmodel. Если я создаю представление напрямую, я бы смог добавить ресурс viewmodel. Однако, поскольку представление создается из DataTemplate, у меня нет ссылки на представление, чтобы напрямую обращаться к его ресурсам. –

 Смежные вопросы

  • Нет связанных вопросов^_^