3

我对设计器有一个简单的问题。我正在尝试将 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" />

同样,在运行时工作并且完全合格,但在设计时不起作用。

4

1 回答 1

1

好吧,我意识到当它在Update2之后不起作用时,错误消息比我抛出的要具体得多。因此,它没有使用我的覆盖。我将其修改为不扩展 TypeExtension 而是扩展 MarkupExtension,现在它可以工作了。

public class CreateTypeExtension : MarkupExtension
{
    public Type Type { get; set; }
    public String TypeName { get; set; }

    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;
    }
}

您可以使用 Type.GetType 文档中可用的任何格式,但不能再使用 XAML 前缀(除非您自己实现)

<comm:CreateType TypeName="Company.Product.Class+Enum,Company.Assembly" />
于 2012-10-19T18:55:19.023 回答