デザイナに単純な問題があります。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" />
繰り返しになりますが、実行時に機能し、完全に認定されていますが、設計時には機能しません。