Использование MEF в элементах управления, созданных из XAML - PullRequest
6 голосов
/ 29 декабря 2011

У меня есть созданный UserControl, который импортирует несколько деталей с использованием атрибута [Import].

public class MyUserControl : UserControl, IPartImportsSatisfiedNotification
{
    [Import]
    public IService Service { get; set; }

    public MyUserControl()
    {
    }

    public void OnImportsSatisfied()
    {
        // Do something with Service.
    }
}

Этот UserControl создается из XAML, поэтому его импорт не выполняется и OnImportsSatisfiedне вызывается.

<local:MyUserControl />

Мой вопрос: как мне удовлетворить импорт моего класса, когда он создается в XAML.

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Из MSDN:

Чтобы создать экземпляр в качестве элемента объекта в XAML, пользовательский класс должен соответствовать следующим требованиям:
Пользовательский класс должен быть открытым и должен предоставлять значение по умолчанию (без параметров)) общественный конструктор.(См. Следующий раздел для примечаний относительно структур.)
Пользовательский класс не должен быть вложенным классом.Дополнительная точка в пути полного имени делает неоднозначным деление пространства имен класса и мешает другим функциям XAML, таким как присоединенные свойства.
Если объект может быть создан как элемент объекта, созданный объект может заполнитьФорма элемента свойства любых свойств, которые принимают объект как базовый тип.
Вы можете предоставить значения объектов для типов, которые не соответствуют этим критериям, если вы включите преобразователь значений.Для получения дополнительной информации см. Преобразователи типов и расширения разметки для XAML.

Оттуда у вас есть два варианта:
1) Использование TypeConverter :
Использование преобразователя типов позволит вам создать экземпляр объекта без конструктора без параметров, но вам нужно будет предоставить TypeConverter, который будет выполнять его создание.

Теперь мне никогда не приходилось его использовать, я не могу вам помочьдалее с этим.

2) Получить IService с помощью ServiceLocator:

public class MyUserControl : UserControl
{    
    public IService Service { get; set; }

    public MyUserControl()
    {
       Service = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IService>();
       // You can do something with Service here already.
    }
}

Я понимаю, что это изменение в дизайне вашего класса, но, надеюсь, вы справитесь с этим.

Надеюсь, это поможет,

Баб.

0 голосов
/ 04 января 2012

Если вы не хотите, чтобы mef создавал ваш usercontrol, вы должны использовать Comconcontainer в вашем usercontrol и вызывать GetExport direct. но тогда у вас есть проблема получить экземпляр вашего составного контейнера :)

ps: я позволил мне создать мои wpf-представления в моих приложениях.

...