在从XAML实例化的控件中使用MEF
我有一个UserControl我创建了使用[Import]
属性[Import]
几个部分。
public class MyUserControl : UserControl, IPartImportsSatisfiedNotification { [Import] public IService Service { get; set; } public MyUserControl() { } public void OnImportsSatisfied() { // Do something with Service. } }
此UserControl是从XAML实例化的,因此不满足其导入,并且未调用OnImportsSatisfied
。
我的问题是如何在XAML中创建类时满足我的类的导入。
来自MSDN:
要在XAML中实例化为对象元素,自定义类必须满足以下要求:
自定义类必须是公共的,并且必须公开默认(无参数)公共构造函数。 (有关结构的说明,请参阅以下部分。)
自定义类不能是嵌套类。 全名路径中的额外“点”使类命名空间划分不明确,并干扰其他XAMLfunction,例如附加属性。
如果可以将对象实例化为对象元素,则创建的对象可以填充将对象作为其基础类型的任何属性的属性元素forms。
如果启用值转换器,仍可以为不符合这些条件的类型提供对象值。 有关更多信息,请参阅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(); // You can do something with Service here already. } }
我意识到这是你class级设计的一个变化,但希望你能应付它。
希望这可以帮助,
巴布。
如果你不想让mef创建你的usercontrol,你必须在usercontrol中使用compositioncontainer并直接调用GetExport。 但是你有问题得到你的compositioncontainer的实例:)
ps:我让我在我的应用程序中创建我的wpf视图。