在从XAML实例化的控件中使用MEF

Adi*_*ter 6 .net c# wpf xaml mef

我有一个UserControl我创建了使用该[Import]属性导入几个部分.

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

    public MyUserControl()
    {
    }

    public void OnImportsSatisfied()
    {
        // Do something with Service.
    }
}
Run Code Online (Sandbox Code Playgroud)

此UserControl是从XAML实例化的,因此其导入不满足OnImportsSatisfied且未被调用.

<local:MyUserControl />
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在XAML中创建类时满足我的类的导入.

Lou*_*ann 2

来自 MSDN:

要在 XAML 中实例化为对象元素,自定义类必须满足以下要求:
自定义类必须是公共的,并且必须公开默认(无参数)公共构造函数。(有关结构的注释,请参阅以下部分。)
自定义类不得是嵌套类。全名路径中的额外“点”使类命名空间划分不明确,并干扰其他 XAML 功能(例如附加属性)。
如果一个对象可以实例化为对象元素,则创建的对象可以填充任何将该对象作为其基础类型的属性的属性元素形式。
如果启用值转换器,您仍然可以为不满足这些条件的类型提供对象值。有关详细信息,请参阅 XAML 的类型转换器和标记扩展。

从那里,您有两个选择:
1) 使用TypeConverter
使用类型转换器将允许您实例化一个没有无参数构造函数的对象,但您必须提供一个 TypeConverter 来执行实例化。

现在,我从来不需要使用它,我无法进一步帮助你。

2) 使用 ServiceLocator 检索 IService:

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

我意识到这是您班级设计的一个变化,但希望您能够应对它。

希望这可以帮助,

巴布。