我正在寫一個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 2009-12-11 22:15:32
爲什麼這行'parentConverter.GetProperties(context.Instance);'返回null? – 2013-04-11 08:18:20