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'が見つかりませんでした。

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)を返すことができると思います。これが単なるバグなのか、それを機能させる方法なのか、私はまだ興味があります。

Update2

独自の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 に答える