我的WPF ViewModelLocator实现在VSTO Excel外接程序中的合成失败。有人能批评吗?

我的WPF ViewModelLocator实现在VSTO Excel外接程序中的合成失败。有人能批评吗?,wpf,c#-4.0,mvvm,vsto,mef,Wpf,C# 4.0,Mvvm,Vsto,Mef,背景: 我正在使用MEF帮助编写一个Excel 2007加载项(VSTO),该加载项可以从电子表格数据创建一个实体,而蠕变要求暴露了我试图协调的体系结构中的一个缺陷(我现在需要识别“模板加载”而不是“工作表提交”上的列) 我的每个本地实体属性都有一个DescriptionAttribute,其中包含工作表中列的名称。在提交时,我会考虑这些属性,以确定哪些属性映射到该工作表列,并创建一个将PropertyName映射到列序号的成对字典。之所以这样做,是因为Excel COM对象模型似乎只公开基于行

背景:

我正在使用MEF帮助编写一个Excel 2007加载项(VSTO),该加载项可以从电子表格数据创建一个实体,而蠕变要求暴露了我试图协调的体系结构中的一个缺陷(我现在需要识别“模板加载”而不是“工作表提交”上的列)

我的每个本地实体属性都有一个DescriptionAttribute,其中包含工作表中列的名称。在提交时,我会考虑这些属性,以确定哪些属性映射到该工作表列,并创建一个将PropertyName映射到列序号的成对字典。之所以这样做,是因为Excel COM对象模型似乎只公开基于行/列序号的工作表单元格。执行此映射允许我的外接程序在工作表上动态定位我的属性,而无需维护到有序映射的任何静态属性

因此,这一切都很好……而且,由于这是我们的业务合作伙伴在重新构建基础系统时的权宜之计,我们讨论了这将是一个非常“不友好”的附加模块,每个人都开始参与。但现在,业务部门对一些将显示在工作表中的参考数据存在验证问题。我们已经同意在提交时执行验证,但这已经改变,需要我将引用列绑定到只包含有效值的验证下拉列表

问题

现在,我需要重新构造视图和ViewModel,以便在加载视图时将列映射到它们的实体属性,这就是问题的根源。我根据Josh Smith提供的代码实现了Josh Smith的RelayCommand,我实现了Reed Copsey Jr的WPFCompositionInitializer,我还创建了一个ViewModelLocator来帮助我的compositioncontainer定位我的ViewModel……但无论我做什么,我都找不到合适的ViewModel。我现在在这个问题上有点烦躁..整个周末都在试图解决它,但没有结果。有人能帮忙吗?我不是MEF专家。我曾涉猎过MVVM模式,但在过去的几年里,我一直在C#之外,错过了它的很多发展。我认为我的问题很可能是根本性的,但我盯着我的代码看了太久,找不到它。请帮忙

代码

我已经开始在微软WPF社交论坛发布相关代码。如果有人想让我把它转寄到这里,我很乐意。但现在,我将包括一个链接到该线程。(我在那篇文章中也加入了背景,但我更喜欢这里的背景。你可以跳过我在那里加入的背景,不要错过任何东西)


我不确定这是否会产生任何影响,但与其导出
StopgapViewModel
类,不如创建一个factory类并导出factory类,如下所示:

public StopgapViewModelFactory 
{
    [Export(typeof(StopgapViewModel))]
    public StopgapViewModel Instance
    {
        get
        {
            return new StopgapViewModel();
        }
    }
}

StopgapViewModel
类中删除[Export]声明,并试一试

您可以使用ExportAttribute装饰实例成员吗?我以为你只能在班级级别导出。(为了记录在案,我尝试了你的技巧,收到了同样的构图错误)是的,你可以。如果您保留factory类,并在StopgapViewModel中设置断点,您在其中的导入是否得到满足?