使用自定义属性禁用 PropertyGrid 中的项目

Disabling items in PropertyGrid using Custom Attributes

我可以通过将 BrowsableAttributes 设置为包含 CategoryAttribute 个对象的数组来选择性地启用/禁用 PropertyGrid 中的项目。但是,我希望启用一个类别中的某些项目并禁用同一类别中的其他项目,所以我想我会创建自己的自定义属性 class 并将其应用于我的对象中的属性,但这似乎并没有工作。

这是我的自定义属性 class:

Public Enum HeadType
    DMA = 1
    TMA = 2
    Both = 0
End Enum
<AttributeUsage(AttributeTargets.Property)>
Public Class HeadTypeAttribute
    Inherits Attribute
    Public Property HeadType As HeadType
    Public Sub New(HeadType As HeadType)
        Me.HeadType = HeadType
    End Sub
    Public Overrides Function Match(obj As Object) As Boolean
        Debug.Print("HeadTypeAttribute.Match obj.HeadType=" & obj.HeadType.ToString())
        Debug.Print("HeadTypeAttribute.Match Me.HeadType=" & Me.HeadType.ToString())
        Dim bMatch As Boolean = TypeOf obj Is HeadTypeAttribute AndAlso CType(obj, HeadTypeAttribute).HeadType = Me.HeadType
        Debug.Print(bMatch)
        Return bMatch
    End Function
End Class

我将 BrowsableAttibutes 设置为一个数组,其中包含我的 HeadTypeAttribute class 的两个实例,一个 HeadType = HeadType.Both,另一个设置为 HeadType.DMA 或 HeadType.TMA.我可以看到正在调用 Match 方法并为某些项目返回 true,但网格始终为空。

不在 BrowsableAttributes 中添加 Both 项并将 Match 函数更改为始终 return 当遇到 Both 值时为真似乎可以修复它:

Public Overrides Function Match(obj As Object) As Boolean
    Return TypeOf obj Is HeadTypeAttribute AndAlso (CType(obj, HeadTypeAttribute).HeadType = Me.HeadType OrElse CType(obj, HeadTypeAttribute).HeadType = HeadType.Both)
End Function