Свойства, отображаемые в PropertyGrid конструктора WinForm, управляются через PropertyDescriptors .Вы можете управлять дескрипторами, возвращаемыми механизмами проверки, несколькими способами.Относительно простой (хотя и утомительный) способ состоит в том, чтобы ваш класс реализовал интерфейс ICustomTypeDescriptor .
Предположим, что ваш класс usercontrol определен следующим образом:
Imports System.ComponentModel
Public Class DemoUC
Public Sub New()
InitializeComponent()
End Sub
<RefreshProperties(RefreshProperties.All)>
Public Property OtherProperty As Boolean
<Browsable(False)>
Public Property MyProperty As String
End Class
Замечаниеатрибут RefreshPropertiesAttribute , украшающий OtherProperty
.Это сообщит PropertyGrid, что он будет извлекать все свойства каждый раз, когда это свойство изменяется.Это необходимо для того, чтобы работала логика для отображения свойства MyProperty
, когда OtherProperty
истинно.
В другом файле класса добавьте следующий частичный класс, который реализует ICustomTypeDescriptor Interface
.
Imports System.ComponentModel
Partial Public Class DemoUC : Implements ICustomTypeDescriptor
Public Function GetAttributes() As AttributeCollection Implements ICustomTypeDescriptor.GetAttributes
Return TypeDescriptor.GetAttributes(Me, True)
End Function
Public Function GetClassName() As String Implements ICustomTypeDescriptor.GetClassName
Return TypeDescriptor.GetClassName(Me, True)
End Function
Public Function GetComponentName() As String Implements ICustomTypeDescriptor.GetComponentName
Return TypeDescriptor.GetComponentName(Me, True)
End Function
Public Function GetConverter() As TypeConverter Implements ICustomTypeDescriptor.GetConverter
Return TypeDescriptor.GetConverter(Me, True)
End Function
Public Function GetDefaultEvent() As EventDescriptor Implements ICustomTypeDescriptor.GetDefaultEvent
Return TypeDescriptor.GetDefaultEvent(Me, True)
End Function
Public Function GetDefaultProperty() As PropertyDescriptor Implements ICustomTypeDescriptor.GetDefaultProperty
Return TypeDescriptor.GetDefaultProperty(Me, True)
End Function
Public Function GetEditor(editorBaseType As Type) As Object Implements ICustomTypeDescriptor.GetEditor
Return TypeDescriptor.GetEditor(Me, editorBaseType, True)
End Function
Public Function GetEvents() As EventDescriptorCollection Implements ICustomTypeDescriptor.GetEvents
Return TypeDescriptor.GetEvents(Me, True)
End Function
Public Function GetEvents(attributes() As Attribute) As EventDescriptorCollection Implements ICustomTypeDescriptor.GetEvents
Return TypeDescriptor.GetEvents(Me, attributes, True)
End Function
Public Function GetProperties() As PropertyDescriptorCollection Implements ICustomTypeDescriptor.GetProperties
Return GetProperties({})
End Function
Public Function GetProperties(attributes() As Attribute) As PropertyDescriptorCollection Implements ICustomTypeDescriptor.GetProperties
Dim basePDs As New PropertyDescriptorCollection(Nothing, False)
For Each pd As PropertyDescriptor In TypeDescriptor.GetProperties(Me, attributes, True)
basePDs.Add(pd)
Next
If Me.DesignMode AndAlso Me.OtherProperty Then
Dim pd As PropertyDescriptor = TypeDescriptor.GetProperties(Me, True).Cast(Of PropertyDescriptor).Where(Function(desc As PropertyDescriptor) desc.Name.Equals(NameOf(Me.MyProperty))).FirstOrDefault()
If basePDs.Contains(pd) Then
basePDs.Remove(pd)
End If
basePDs.Add(New BrowsableDescriptor(pd))
End If
Return basePDs
End Function
Public Function GetPropertyOwner(pd As PropertyDescriptor) As Object Implements ICustomTypeDescriptor.GetPropertyOwner
Return Me
End Function
Class BrowsableDescriptor : Inherits PropertyDescriptor
Private src As PropertyDescriptor
Public Sub New(src As PropertyDescriptor)
MyBase.New(src.Name, Nothing)
Me.src = src
Dim attribs As New List(Of Attribute)
For Each att As Attribute In src.Attributes
If TypeOf att Is BrowsableAttribute Then Continue For
attribs.Add(att)
Next
attribs.Add(BrowsableAttribute.Yes)
MyBase.AttributeArray = attribs.ToArray
End Sub
Public Overrides ReadOnly Property IsBrowsable As Boolean
Get
Return True
End Get
End Property
Public Overrides ReadOnly Property ComponentType As Type
Get
Return src.ComponentType
End Get
End Property
Public Overrides ReadOnly Property IsReadOnly As Boolean
Get
Return src.IsReadOnly
End Get
End Property
Public Overrides ReadOnly Property PropertyType As Type
Get
Return src.PropertyType
End Get
End Property
Public Overrides Sub ResetValue(component As Object)
src.ResetValue(component)
End Sub
Public Overrides Sub SetValue(component As Object, value As Object)
src.SetValue(component, value)
End Sub
Public Overrides Function CanResetValue(component As Object) As Boolean
Return src.CanResetValue(component)
End Function
Public Overrides Function GetValue(component As Object) As Object
Return src.GetValue(component)
End Function
Public Overrides Function ShouldSerializeValue(component As Object) As Boolean
Return src.ShouldSerializeValue(component)
End Function
End Class
End Class
Большая часть реализации просто возвращает то, что могла бы предоставить база TypeDescriptor
.В функции GetProperties
реализуется логика, позволяющая заменить небезопасный PropertyDescriptor для свойства MyProperty
на доступный для просмотра.
После компиляции кода элемент управления DemoUC
отображать, как это в PropertyGrid.Обратите внимание, что MyProperty
отображается / скрыт на основе значения OtherProperty
.