私は任意のオブジェクトのプロパティを編集できるようにするGUIアプリケーションを作成しています(そのタイプは実行時にのみ認識されます)。PropertyGridとオブジェクトの動的タイプ
私はこの機能を有効にするためにPropertyGridコントロールを使用することに決めました。私は編集する必要があるオブジェクトのインスタンスを取得する場合、私はそれのためのラッパーを作成し、選択したオブジェクトとして設定し
[TypeConverter(typeof(ExpandableObjectConverter))]
[DefaultPropertyAttribute("Value")]
public class Wrapper
{
public Wrapper(object val)
{
m_Value = val;
}
private object m_Value;
[NotifyParentPropertyAttribute(true)]
[TypeConverter(typeof(ExpandableObjectConverter))]
public object Value
{
get { return m_Value; }
set { m_Value = value; }
}
}
:
Wrapper wrap = new Wrapper(obj);
propertyGrid.SelectedObject = wrap;
しかし、私 は、私は、次のクラスを作成しましたobjの型がいくつかのカスタム型(つまり、自分で定義したクラス、または複合型で構築したクラス)であっても、objがプリミティブでないときにのみ、上記のように動作します。
[TypeConverter(typeof(ExpandableObjectConverter))]
public class SomeClass
{
public SomeClass()
{
a = 1;
b = 2;
}
public SomeClass(int a, int b)
{
this.a = a;
this.b = b;
}
private int a;
[NotifyParentPropertyAttribute(true)]
public int A
{
get { return a; }
set { a = value; }
}
private int b;
[NotifyParentPropertyAttribute(true)]
public int B
{
get { return b; }
set { b = value; }
}
}
をと実行します:たとえば
は、私が定義した場合
そして、すべての作品が膨らみます。私は次のことを行う一方、:
int num = 1;
Wrapper wrap = new Wrapper(num);
propertyGrid.SelectedObject = wrap;
それから私は、グリッド内の「1」の値を見ることができます(そしてそれがグレイスケールではないです)が、私は値を編集することはできません。 Wrapperの "Value"プロパティの型をintに変更してTypeConverter属性を削除すると、それが機能することに気付きました。 他のプリミティブ型と文字列で同じ動作が発生します。
何が問題ですか?
ありがとうございます!
ありがとう、それはトリックでした! :) – Marina
なぜこの行 'parentConverter.GetProperties(context.Instance);'はnullを返しますか? –