Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 仅当定义了导出时才发现MEF零件_.net_Wpf_Mef_Composition - Fatal编程技术网

.net 仅当定义了导出时才发现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; } }

我目前正试图用MEF构建一个简单的概念证明,但我无法让它工作。我的解决方案中有三个项目:

  • 一个可移植的类库,它定义了一个简单的类(我们在这里称它为
    Component
  • 一个.NET库,它定义了一个从Button派生的类,并声明了一个类型为
    Component
    的属性,该属性用
    Import
    属性标记:

    public class ComponentButton : Button
    {
        [Import]
        public Component Component { get; set; }
    }
    
  • 一种WPF应用程序,其主窗口具有在构造函数中初始化的ComponentButton(标记为导出)类型的属性。然后我想使用MEF将此组件分配给窗口中显示的所有按钮(目前只有一个按钮在XAML中定义):

然而,这不起作用。不会引发异常,但组件未指定给按钮。当我在调试器中查看目录时,我可以看到,虽然加载了所有程序集并找到了ExportDefinition,但找不到导入定义。但真正让我困惑的是,当我向按钮添加导出时,它突然检测到按钮的导出和导入:

[Export]
public string Dummy { get; set; }

但即使如此,它仍然不会将组件分配给按钮。发生了什么事?

没有设置按钮的属性,因为按钮是由WPF(通过
InitializeComponent
调用)创建的,而不是由MEF创建的。从理论上讲,您可以遍历可视化树并为每个对象调用
container.SatisfyImportsOnce(obj)
,但从性能角度看,这将是一件可怕的事情

一种解决方案是使用绑定像往常一样设置属性。但是,可以让按钮执行自合成。您必须以某种方式公开容器(例如通过静态属性),并在构造函数中对其自身进行按钮调用
SatisfyImportsOnce

Global.MyCompositionContainer.SatisfyImportsOnce(this);
也许会有帮助

Global.MyCompositionContainer.SatisfyImportsOnce(this);