XAML子类类型声明设计师错误

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 未找到类型“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" />

这段代码在运行时可以正常工作并且是完全合格的,但是在设计时却无法工作。

1个回答

1

好的,我意识到当在更新2后它仍然无法工作时,错误信息比我所抛出的要具体得多。因此,它没有使用我的覆盖。我将其修改为不扩展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" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接