You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForm PropertyGrid如何修改分类显示值并移除类名?

解决方案:自定义TypeConverter实现嵌套类的自定义显示

默认的ExpandableObjectConverter不会读取类级别的DisplayName和Description特性,所以你在类上添加的这些特性无法被PropertyGrid识别,导致仍然显示类名。要解决这个问题,需要自定义一个TypeConverter来处理显示逻辑。

步骤1:实现自定义转换器

创建继承自ExpandableObjectConverter的自定义转换器,重写ConvertTo方法来读取类的DisplayName和Description并组合显示:

using System;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;

public class CustomExpandableConverter : ExpandableObjectConverter
{
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string) && value != null)
        {
            // 获取类的DisplayName特性
            var displayNameAttr = value.GetType().GetCustomAttribute<DisplayNameAttribute>();
            string displayName = displayNameAttr?.DisplayName ?? value.GetType().Name;
            
            // 获取类的Description特性
            var descriptionAttr = value.GetType().GetCustomAttribute<DescriptionAttribute>();
            string description = descriptionAttr?.Description ?? "";
            
            // 组合显示文本,可按需调整格式
            return string.IsNullOrEmpty(description) ? displayName : $"{displayName} - {description}";
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}

步骤2:应用自定义转换器到嵌套类

将嵌套类的TypeConverter特性替换为自定义的转换器:

[TypeConverter(typeof(CustomExpandableConverter))]
[Description("Application general settings")]
[DisplayName("General settings")]
public class CApplicationSettings
{
    [Description("Application Hotkeys")]
    [DisplayName("Hotkeys")]
    public CHotkeyList Hotkeys { get; set; } = CHotkeyList.DefaultHotykeys;
}

步骤3:确保属性特性正确

注意PropertyGrid默认识别System.ComponentModel命名空间下的特性,所以在父类属性上使用对应特性:

public class CSettings
{
    [Category("Application"), DisplayName("Application"), Description("Application settings")]
    public CApplicationSettings Application { get; set; } = new CApplicationSettings();

    [Category("Audio"), DisplayName("Audio"), Description("Audio settings")]
    public CAudioSettings Audio { get; set; } = new CAudioSettings();
}

完成以上修改后,PropertyGrid中:

  • Application属性的值列会显示General settings - Application general settings(替代原类名)
  • 展开Application后,Hotkeys属性会显示自定义名称和描述
  • 分类和属性的DisplayName、Description都会正常生效

内容的提问来源于stack exchange,提问作者Horst Walter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:05:26