我在使用设计师时遇到了一个简单的问题。我试图将DataGridComboBoxColumn的ItemsSource绑定到枚举值列表上。代码可以编译和执行,但是设计师显示“加载问题”,无法正常加载。如果我点击“重新加载设计师”,它会在错误列表中显示一个错误。我正在使用VS2010。
<ObjectDataProvider x:Key="myEnum"
MethodName="GetValues"
ObjectType="{x:Type core:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type Type="data:ParentClass+MyEnum" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
当应用程序执行时,它可以正常工作。但在设计器中,会显示以下错误:
错误 5 未找到类型“data:ParentClass+MyEnum”。
我不确定我何时使用过 Class+Subclass 语法(而不是 Class.Subclass)来编写 XAML,也不知道为什么需要这么做,但如果代码能正常工作,那么设计器似乎也应该正常工作!这导致我的整个窗口在设计时都无法获得支持,如果想要在设计时查看更改的效果,这并不好。
更新 好吧,再提供一些信息:首先,+ 语法来源于Type.GetType(String) 方法,您可以在其中查看其格式。
但是,System.Windows.Markup.TypeExtension 使用 IXamlTypeResolver 服务来解析类型。从反编译器中我们可以看到:
IXamlTypeResolver service = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
this._type = service.Resolve(this._typeName);
据我了解,设计师使用的服务实现与运行时完全不同?!我还没有找到具体的实现方法。
我认为我可以编写自己的“TypeExtension”类,然后只需返回Type.GetType(typeName)。但我仍然很好奇这是一个bug还是一种使其工作的方法。
更新2
我创建了自己的TypeExtension类,但没有起到帮助作用。由于某些原因,Type.GetType()在设计师中无法解析我的枚举类型(但在运行时可以)。
public class CreateTypeExtension : TypeExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (this.Type == null)
{
if (this.TypeName == null)
{
throw new InvalidOperationException();
}
this.Type = Type.GetType(TypeName);
if (this.Type == null)
{
throw new InvalidOperationException("Bad type name");
}
}
return this.Type;
}
}
我正在传递它。
<comm:CreateType TypeName="Company.Product.Class+Enum,Company.Assembly" />
这段代码在运行时可以正常工作并且是完全合格的,但是在设计时却无法工作。