如果有人之前遇到过这种情况,我会把它丢掉.
在WPF设计器中创建DesignData时,我会遇到以下两个错误之一:
对象与目标类型不匹配. Microsoft.Expression.DesignModel.InstanceBuilders.ClrObjectInstanceBuilder
中的System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
(SNIP)
.UpdateProperty(IInstanceBuilderContext上下文,ViewNode viewNode,IProperty propertyKey,DocumentNode valueNode)
另一个是提供更多信息:
值"_.di0.MyProjectLol.MyType"不是"MyProjectLol.MyType"类型,不能在此通用集合中使用.
在 Microsoft.Expression.DesignModel.InstanceBuilders.ClrObjectInstanceBuilder 中的System.ThrowHelper.ThrowWrongValueTypeArgumentException(Object value,Type targetType)
(SNIP)
.InstantiateChildren(IInstanceBuilderContext context,ViewNode viewNode,DocumentCompositeNode compositeNode,Boolean isNewInstance)
在调试时,我可以看到有一个动态程序集加载了proxy-ish类型,看起来像我的,但显然不是.这个程序集叫做Blend_RuntimeGeneratedTypeAssembly(Guid在这里).尝试在此程序集中加载类型时,它会为许多类型引发类型加载异常.因此,有些类型被代理,有些类型被留下作为上帝和我的意图,当它们混合时,会出现不自然的行为.
例如,类型"Foo"可能会创建一个代理,但没有其他类型(TypeLoadExceptions).然后设计师尝试将我的一个真实类型的代理交给代理(由xaml序列化喜欢将集合转换为IList,从而对类型安全性产生影响)并且您得到上述异常之一.
我花了半个星期试图解决这个问题.我已经尝试了一百种不同的东西,但我无法确切地知道导致它失败的原因.欢迎提出建议,TIA.
小智 5
解决方案分为两部分:
1)确保VS完全更新.此时,这意味着为Visual Studio 2010 安装Silverlight 4工具.它们包括WPF设计器的最新更新.如果你在遥远的未来阅读这篇文章,请忽略这一点.
2)点击设计数据文件的属性.清除"自定义工具",并将"构建操作"设置为"DesignData"或"DesignTimeDataWithDesignTimeCreatableTypes".
DesignData意味着您的类型无法直接从xaml反序列化(由于依赖性等),因此设计人员尝试为这些类型创建模拟并将模拟呈现给您的设计图面.
DesignTimeDataWithDesignTimeCreatableTypes表示设计器将加载程序集并将xaml直接反序列化到类型中,而不创建模拟.