Я столкнулся с точно такой же проблемой, и она была трудной для начинающего MEF / PRISM.okieh очень хорошо описывает проблему, я просто хочу опубликовать альтернативное решение, взятое из примера приложения StocktraderUI :
Решение работает (/ кажется, работает), если вы хотите просмотреть обнаружение безлюбая форма файла конфигурации и т. д., где вы должны зарегистрировать свои представления.
1.Измените пользовательское событие ViewExport
[Export]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
[MetadataAttribute]
public sealed class ViewExportAttribute : ExportAttribute, IViewRegionRegistration
{
public ViewExportAttribute()
: base(typeof(UserControl))
{ }
public string ViewName { get { return base.ContractName; } }
public string RegionName { get; set; }
}
Атрибут [Export] добавлен, и базовый конструктор теперь вызывается с UserControl
вместо object
.Таким образом, он может быть обнаружен MEF.
2.Изменить AutoPopulateExportedViewsBehavior
[ImportMany(typeof(UserControl))]
public Lazy<UserControl, IViewRegionRegistration>[] RegisteredViews { get; set; }
Атрибут [ImportMany]
добавлен, а тип инициализации Lazy изменен на UserControl
.Теперь все UserControl
s с IViewRegionRegistration
-производящим MetaData-type импортируются.
Вот и все.Вы можете использовать [ViewExport]
, как и раньше.Обратите внимание, что представления ограничены (под) типами UserControl
.Я полагаю, это можно изменить, если вы хотите.И убедитесь, что ваш сводный каталог импортирует ViewExportAttribute
и AutoPopulateExportedViewsBehavior
, как сказал Николаус ...
Таким образом, вам не нужны дополнительные интерфейсы для ваших представлений, и вы все равно можете обнаружить все без жестко прописанной регистрации.
Надеюсь, это поможет и даст мне знать, если я пропустил какие-либо недостатки моего решения.