我正在定义一个与PropertyGrid控件一起使用的自定义类。比如,其中一个属性定义如下:
[CategoryAttribute("Section Name"),
DefaultValueAttribute("Default value"),
DescriptionAttribute("My property description")]
public string MyPropertyName
{
get { return _MyPropertyName; }
set { _MyPropertyName = value; }
}
private string _MyPropertyName;
如您所见DefaultValueAttribute
定义了属性的默认值。这种默认值用于两种情况:
如果此属性值从默认值更改为
PropertyGrid
控件将以粗体显示,
如果我调用ResetSelectedProperty
的{{1}}方法,
它会将该默认值应用于所选单元格。
这个概念很好,除了PropertyGrid
的一个限制。它只接受一个常量值。所以我很好奇,我可以动态地设置它,例如,从构造函数或稍后的代码中设置它吗?
编辑:我找到了this code,让我可以阅读DefaultValueAttribute
:
DefaultValueAttribute
问题是,你如何设置它?
答案 0 :(得分:12)
最后,我得到了答案!我已经遇到了很多网站,展示了如何实现ICustomTypeDescriptor
和PropertyDescriptor
(here's one),如果您想要将两页代码添加到您的10-线类。
这是一种更快捷的方式。我找到了一个提示here。祝福那些真正发表建设性意见的人!
所以答案是在你的班级中提供两种方法。一个是private bool ShouldSerializePPP()
,另一个是private void ResetPPP()
,其中PPP
是您的属性名称。前一个方法将由PropertyGrid
调用以确定属性值是否从默认值更改,并且只要PropertyGrid
项重置为默认值,就会调用后一个方法。
以下是我的类应该如何使用这些添加内容,这将允许在运行时为属性设置默认值:
[CategoryAttribute("Section Name"),
DescriptionAttribute("My property description")]
public string MyPropertyName
{
get { return _MyPropertyName; }
set { _MyPropertyName = value; }
}
private bool ShouldSerializeMyPropertyName()
{
//RETURN:
// = true if the property value should be displayed in bold, or "treated as different from a default one"
return !(_MyPropertyName == "Default value");
}
private void ResetMyPropertyName()
{
//This method is called after a call to 'PropertyGrid.ResetSelectedProperty()' method on this property
_MyPropertyName = "Default value";
}
private string _MyPropertyName;