我正在编写一个 GUI 应用程序,我需要在其中启用任意对象的编辑属性(它们的类型仅在运行时才知道)。
我决定使用 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 并将其设置为选定的对象:
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; }
}
}
并做:
Wrapper wrap = new Wrapper(new SomeClass());
propertyGrid.SelectedObject = wrap;
然后一切正常。另一方面,当我执行以下操作时:
int num = 1;
Wrapper wrap = new Wrapper(num);
propertyGrid.SelectedObject = wrap;
然后我可以在网格中看到值“1”(它不是灰度的),但我无法编辑该值。我注意到,如果我将 Wrapper 的“Value”属性的类型更改为 int 并删除 TypeConverter 属性,它就可以工作。对于其他原始类型和字符串,我得到相同的行为。
问题是什么?
提前致谢!