如何在属性网格中显示动态对象?
我有一个自定义对象类型,必须在 PropertyGrid
中进行编辑:
public class CustomObjectType
{
public string Name { get; set; }
public List<CustomProperty> Properties {get; set;}
}
它有一个自定义属性列表:
public class CustomProperty
{
public string Name { get; set; }
public string Desc { get; set; }
public Object DefaultValue { get; set; }
Type type;
public Type Type
{
get
{
return type;
}
set
{
type = value;
DefaultValue = Activator.CreateInstance(value);
}
}
}
这里的主要问题是 PropertyGrid
控件不允许编辑,也不对属性 DefaultValue
使用适当的编辑工具,该属性是通过设置 CustomProperty
字段 Type
的值预先实例化的。
DefaultValue
的类型仅在运行时已知。
此外,我需要为 CustomProperty
的属性 Type
提供自定义 TypeConverter
以显示支持类型的下拉列表(例如,<代码>Int、字符串
、颜色
、MyOwnClass
)。
我该怎么做?
I have a custom object type which has to be editable in PropertyGrid
:
public class CustomObjectType
{
public string Name { get; set; }
public List<CustomProperty> Properties {get; set;}
}
Which has a list of custom properties:
public class CustomProperty
{
public string Name { get; set; }
public string Desc { get; set; }
public Object DefaultValue { get; set; }
Type type;
public Type Type
{
get
{
return type;
}
set
{
type = value;
DefaultValue = Activator.CreateInstance(value);
}
}
}
The main problem here is that the PropertyGrid
control doesn't allow to edit, nor uses appropriate editing tools for property DefaultValue
which is beforehand instantiated by setting value of CustomProperty
's field Type
.
Type of DefaultValue
is only known at runtime.
Moreover I need to supply a custom TypeConverter
for CustomProperty
's property Type
to show a drop-down list of supported types (for example, Int
, String
, Color
, MyOwnClass
).
How would i do that?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
要沿着这条路线走下去,您需要为每个属性创建一个自定义
PropertyDescriptor
。然后,您可以通过自定义TypeConverter
或(或者)ICustomTypeDescriptor
/TypeDescriptionProvider
公开它。例子:To go down this route, you would need to create a custom
PropertyDescriptor
per property. You would then expose that via a customTypeConverter
, or (alternatively)ICustomTypeDescriptor
/TypeDescriptionProvider
. Example:我认为马克·格拉维尔可能有点误解了上下文。
我试图编辑 CustomObjectTypes 的属性而不是“CustomObjects”本身。
这是修改后的 Marc 的代码,它可以做到这一点:
它有效,但是,我发现它是一个相当尴尬的解决方案。
因为我为 Object 提供 PropertyDescriptor,为 CustomProperty 提供 CustomPropertyConverter,这两者实际上并没有做任何有意义的事情。
但我也无法删除它们。
是否有一种优雅的方法来允许根据对象的运行时信息使用适当的编辑器编辑对象类型的属性(如默认值)?
I think Marc Gravell might have misunderstood the context a little.
I was trying to edit properties of CustomObjectTypes not the "CustomObjects" themselves.
Here's modified Marc's code that does that:
It works, however, I find it a rather awkward solution.
Because i'm supplying a PropertyDescriptor for Object and CustomPropertyConverter for CustomProperty, both of which doesn't actually do anything meaningful.
Yet I can't remove them either.
Is there an elegant way to allow editing properties of type Object(like the DefaultValue) using appropriate editors according to runtime information of the object?