.net 仅当定义了导出时才发现MEF零件
我目前正试图用MEF构建一个简单的概念证明,但我无法让它工作。我的解决方案中有三个项目:.net 仅当定义了导出时才发现MEF零件,.net,wpf,mef,composition,.net,Wpf,Mef,Composition,我目前正试图用MEF构建一个简单的概念证明,但我无法让它工作。我的解决方案中有三个项目: 一个可移植的类库,它定义了一个简单的类(我们在这里称它为Component) 一个.NET库,它定义了一个从Button派生的类,并声明了一个类型为Component的属性,该属性用Import属性标记: public class ComponentButton : Button { [Import] public Component Component { get; set; } }
- 一个可移植的类库,它定义了一个简单的类(我们在这里称它为
)Component
- 一个.NET库,它定义了一个从Button派生的类,并声明了一个类型为
的属性,该属性用Component
属性标记:Import
public class ComponentButton : Button { [Import] public Component Component { get; set; } }
- 一种WPF应用程序,其主窗口具有在构造函数中初始化的ComponentButton(标记为导出)类型的属性。然后我想使用MEF将此组件分配给窗口中显示的所有按钮(目前只有一个按钮在XAML中定义):
[Export]
public string Dummy { get; set; }
但即使如此,它仍然不会将组件分配给按钮。发生了什么事?没有设置按钮的属性,因为按钮是由WPF(通过
InitializeComponent
调用)创建的,而不是由MEF创建的。从理论上讲,您可以遍历可视化树并为每个对象调用container.SatisfyImportsOnce(obj)
,但从性能角度看,这将是一件可怕的事情
一种解决方案是使用绑定像往常一样设置属性。但是,可以让按钮执行自合成。您必须以某种方式公开容器(例如通过静态属性),并在构造函数中对其自身进行按钮调用SatisfyImportsOnce
:
Global.MyCompositionContainer.SatisfyImportsOnce(this);
也许会有帮助
Global.MyCompositionContainer.SatisfyImportsOnce(this);