为何DbConnectionStringBuilder派生类会彻底破坏Property Grid绑定?
问题根本原因
DbConnectionStringBuilder 类实现了 ICustomTypeDescriptor 接口,这是导致WPF Property Grid绑定异常的特殊机制。
绝大多数Property Grid控件获取对象属性都是通过TypeDescriptor类提供的类型元数据,而实现了ICustomTypeDescriptor的类可以在运行时自定义返回的属性描述符集合,不会使用编译期定义的CLR属性元数据。DbConnectionStringBuilder的默认实现会返回内部维护的连接字符串关键字对应的动态属性描述符,这些描述符的读写逻辑直接操作内部键值对集合,完全不会调用你在派生类中定义的CLR属性的get/set访问器,因此你设置的断点不会命中,属性也会显示为空。
部分官方数据库的连接字符串构造器可以正常工作,是因为这些官方实现已经把CLR属性和内部动态属性做了对齐,动态属性描述符的读写逻辑会映射到对应的CLR属性上,因此表现正常。你自定义的派生类没有做这层映射,所以所有属性都无法正常绑定。
可行解决方案
方案1:自定义类型描述规则
直接在你的派生类上添加 [TypeDescriptionProvider(typeof(CLRTypeDescriptionProvider))] 特性即可,.NET 内置的 CLRTypeDescriptionProvider 会忽略类本身的 ICustomTypeDescriptor 实现,直接返回编译期定义的CLR属性信息,所有Property Grid都可以正常识别。
修改后的类定义开头示例:
[TypeDescriptionProvider(typeof(CLRTypeDescriptionProvider))] public class CsvConfigurator : DbConnectionStringBuilder { // 原有逻辑保持不变 }
方案2:封装POCO绑定层
额外定义一层普通POCO类作为绑定源,把属性读写转发到内部的DbConnectionStringBuilder实例,普通POCO没有自定义类型描述逻辑,所有Property Grid都能正常识别。
内容的提问来源于stack exchange,提问作者Mason Wheeler

