如何为PropertyGrid绑定的类添加命令?VB示例代码求助
在WinForms PropertyGrid底部添加自定义重置命令
要在PropertyGrid底部显示针对SampleClass实例的重置命令,你需要通过类型描述扩展为类添加设计器动词(DesignerVerb),PropertyGrid会自动识别并展示这些动词作为底部操作链接。以下是具体实现步骤:
1. 实现自定义类型描述提供者
创建自定义的TypeDescriptionProvider和TypeDescriptor,用来为SampleClass添加重置动词:
Imports System.ComponentModel Imports System.Windows.Forms.Design Public Class SampleClassTypeDescriptionProvider Inherits TypeDescriptionProvider Public Sub New() MyBase.New(TypeDescriptor.GetProvider(GetType(SampleClass))) End Sub Public Overrides Function GetTypeDescriptor(ByVal objectType As Type, ByVal instance As Object) As ICustomTypeDescriptor Dim baseDescriptor = MyBase.GetTypeDescriptor(objectType, instance) Return New SampleClassTypeDescriptor(baseDescriptor, instance) End Function End Class Public Class SampleClassTypeDescriptor Inherits CustomTypeDescriptor Private ReadOnly _sampleInstance As SampleClass Public Sub New(parent As ICustomTypeDescriptor, instance As Object) MyBase.New(parent) _sampleInstance = DirectCast(instance, SampleClass) End Sub Public Overrides Function GetVerbs() As DesignerVerbCollection Dim verbs = MyBase.GetVerbs() ' 添加重置实例的动词 verbs.Add(New DesignerVerb("重置实例", AddressOf OnResetInstance)) Return verbs End Function Private Sub OnResetInstance(sender As Object, e As EventArgs) ' 调用实例的Reset方法 _sampleInstance.Reset() ' 通知PropertyGrid刷新属性值 With TypeDescriptor.GetProperties(_sampleInstance) .Item("Value1").ResetValue(_sampleInstance) .Item("Value2").ResetValue(_sampleInstance) End With End Sub End Class
2. 为SampleClass绑定类型描述提供者
修改SampleClass,添加TypeDescriptionProviderAttribute指定我们的自定义提供者:
<TypeDescriptionProvider(GetType(SampleClassTypeDescriptionProvider))> Public Class SampleClass Public Const DefValue = 1 Public Property Value1 As Integer = DefValue Public Property Value2 As Integer = DefValue Public Sub Reset() Value1 = DefValue Value2 = DefValue End Sub End Class
3. 验证效果
运行窗体后,PropertyGrid底部会出现「重置实例」的操作链接,点击后会执行SampleClass的Reset方法,同时PropertyGrid会自动刷新显示属性的默认值。
补充说明
- 如果需要为单个属性添加重置选项,只需给属性添加
DefaultValueAttribute,右键属性即可看到重置选项; - 若你的类继承自
Component,也可以通过添加DesignerAttribute并在自定义Designer中添加DesignerVerb来实现,不过对于普通类,使用TypeDescriptionProvider是更通用的方案。
内容的提问来源于stack exchange,提问作者Bogdan Samchuk
相关产品推荐
相关产品推荐

