2010-11-22 1 views
2

Я изучаю призму V4, используя MEF для загрузки моих модулей. Загрузка модулей действительно работает, но в одном модуле я хочу загрузить View/ViewModel (MVVM) и не знаю, как я могу заставить MEF разрешить все это для меня.Обдумывание вокруг MEF: как загрузить View (Model)?

Во-первых: как мне нужно отметить ViewModel (я следую примеру StockTraderRI), поэтому он не загружается при запуске, но может быть загружен во время выполнения в регион?

Во-вторых: как загрузить ViewModel с помощью MEF, чтобы он подключался к соответствующим интерфейсам?

MEF делает это очень красиво для вещей при запуске, отмеченных как [Экспорт], но я понятия не имел, как достичь этого во время выполнения.

ответ

2

Вы можете использовать так называемый Lazy Export, чтобы интерфейс не разрешался, пока вы его явно не используете.

Если вам нужно создать несколько экземпляров, MEF не поддерживает это особенно хорошо. Вы можете сделать свое собственное открытие и создание экземпляра, или вы можете определить экспорт, как это:

[PartCreationPolicy(CreationPolicy.NonShared)] 
[Export(typeof(ISomething)] 
public class Something : ISomething { } 

Недостатком является то, что теперь везде, где вам необходимо создать экземпляр, вам нужно иметь ссылку на текущий экземпляр Container , Тогда вы можете сделать:

var something = _container.GetExportedObject<ISomething>(); 

EDIT: Хорошо, я думаю, я лучше понимаю, что вы после этого. Вот как я обычно решить эту проблему:

  1. я реализую мой взгляд объекты как экземпляры UserControl и не установить DataContext где-нибудь в коде или XAML.

  2. Я создаю DataTemplate, который связывается с типом ViewModel с UserControl.

  3. На моем MainViewModel (или что-то, что соответствует View, где расположены регионы), я выставляю общий объект RegionX (возможно, набрал интерфейс, если все мои ViewModels будут использовать общие функции, но Object отлично работает).

  4. Я создаю ContentPresenter с содержимым, связанным с свойством RegionX.

  5. Теперь мой MainViewModel может импортировать различные экземпляры ViewModel, соответствующие типам ViewModels, которые могут быть размещены RegionX. Когда я хочу переключить «активный» вид в регионе, я просто устанавливаю RegionX в соответствующую ViewModel.

+0

Я больше искал что-то вроде MefMagic.Create , который должен был создать MyView? – Sam 2010-11-22 15:44:05