Как использовать MVVM и MEF с DataTemplate? - PullRequest
0 голосов
/ 11 февраля 2010

Я пытаюсь использовать MEF для нового проекта в моем приложении. Все работает на уровне основного приложения, но в этом отдельном проекте, сборка которого включена в основное приложение (это UserControl), меня интересует кое-что ... Если у меня есть UserControl, и в нем у меня есть следующее:

  <UserControl.Resources>
      <DataTemplate DataType="{x:Type vm:MyViewModel}" >
          <local:MyView />
      </DataTemplate>
  </UserControl.Resources>
  <vm:MyViewModel />

В моем MyViewModel я экспортирую некоторые вещи, и сборки, кажется, составлены просто отлично (я использую CompositionInfoTextFormatter, чтобы проверить это). Но моя виртуальная машина не создается MEF или, по крайней мере, конструктор никогда не вызывается. И когда он вызывается, он кажется из среды WPF, а не из MEF.

Как правильно A) В xaml свяжите мою виртуальную машину с ее представлением с MEF (если отличается от описанного выше) и B) Как создать экземпляр моей виртуальной машины, чтобы MEF управлял ею, и, следовательно, работала функция экспорта и импорта

В настоящее время они этого не делают, поэтому я пытаюсь разобраться во всем этом:)

Ответы [ 2 ]

3 голосов
/ 11 февраля 2010

Учитывая то, что вы показываете выше, MEF здесь вообще не вступает в игру. У вас есть полностью автономный UserControl.

На самом деле, отображаемый вами UserControl можно сделать гораздо проще:

Это почти то же самое, что вы написали выше. На самом деле нет никаких оснований для существования этого UserControl, поскольку вы можете просто вставить MyView напрямую.


При этом я лично использую MEF для генерации DataTemplate. Я справляюсь с тем, что у меня есть класс, который экспортирует ResourceDictionary, а главное приложение импортирует ResourceDictionary и объединяет его с основными ресурсами приложения.

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


Edit:

Похоже, ваша проблема в том, что [Import] не заполнены, так как вы используете WPF для построения вместо MEF. Если это так, вы можете использовать класс PartInitializer, доступный здесь . Подробнее см. блог Гленна Блока .

0 голосов
/ 30 июля 2010

Вы можете взглянуть на примеры приложений WPF Application Framework (WAF) . Они показывают, как MEF используется для создания экземпляров классов ViewModel.

...