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
相关产品推荐
相关产品推荐

