我对设计器有一个简单的问题。我正在尝试将 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 找不到类型“数据:ParentClass+MyEnum”。
我不确定我在哪里遇到过 XAML 的 Class+Subclass 语法(而不是 Class.Subclass),或者为什么它是必要的,但如果代码有效,设计师似乎应该工作?!这会杀死我对整个窗口的所有设计时支持,如果我想查看设计时的变化情况,这并不好
更新 好吧,更多信息:首先,+ 语法来自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)。我仍然很好奇这是否只是一个错误或使其工作的一种方式。
更新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" />
同样,在运行时工作并且完全合格,但在设计时不起作用。