4

我正在定义一个要与PropertyGrid控件一起使用的自定义类。比如说,其中一个属性是这样定义的:

[CategoryAttribute("Section Name"),
DefaultValueAttribute("Default value"),
DescriptionAttribute("My property description")]
public string MyPropertyName
{
    get { return _MyPropertyName; }
    set { _MyPropertyName = value; }
}

private string _MyPropertyName;

如您所见DefaultValueAttribute,定义了属性的默认值。这样的默认值在两种情况下使用:

  1. 如果此属性值从默认值更改,则 PropertyGrid控件将以粗体显示,并且

  2. 如果我调用ResetSelectedProperty的方法PropertyGrid,它将将该默认值应用于选定的单元格。

这个概念很好用,除了DefaultValueAttribute. 它只接受一个常数值。所以我很好奇,我可以动态设置它吗,比如说,从构造函数或稍后在代码中?

编辑:我能够找到让我阅读的代码DefaultValueAttribute

AttributeCollection attributes = TypeDescriptor.GetProperties(this)["MyPropertyName"].Attributes;
DefaultValueAttribute myAttribute = (DefaultValueAttribute)attributes[typeof(DefaultValueAttribute)];
string strDefaultValue = (string)myAttribute.Value;

问题是,你如何设置它?

4

1 回答 1

16

终于,我得到了答案!我遇到了一堆展示如何实现ICustomTypeDescriptorPropertyDescriptor这里是一个)的网站,如果你想在你的 10 行类中添加两页代码,这很好。

这是一个更快的方法。我在这里找到了提示。祝福那些真正发表建设性想法的人!

所以答案是在你的类中提供两种方法。一个是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;
于 2013-11-04T00:31:22.450 回答