У меня была странная проблема с редактированием класса в сетке свойств, из-за чего сетка свойств некорректно обновлялась.
Мне удалось свести проблему к классу с двумя свойствами.Я включил код в конце, чтобы облегчить объяснение.
Он сводится к классу с двумя свойствами.Первый из которых является расширяемым (шрифт).Сам класс является расширяемым, а также реализует метод CreateInstance в преобразователе типов.
Чтобы увидеть проблему, разверните шрифт, отредактируйте, скажем, «Полужирный», и уберите вкладку.Происходят две проблемы:
(1) Второе свойство подскакивает и заканчивается в расширенном свойстве шрифта.
(2) Знак «-» расширенного шрифта меняется на «+».
Проблема устраняется путем присоединения ResfreshProperties (RefreshProperties.All) к классу.
Это здорово, но я бы хотел понять, как это решило проблему.Я взглянул на рефлектор и не могу найти примеры присоединения RefreshProperties на уровне класса.
/// Простой класс
<TypeConverter(GetType(Class1Converter)), _
RefreshProperties(RefreshProperties.All)> _
Public Class Class1
Public Sub New(ByVal font As Font, ByVal image As Image)
Me.New()
Me.Image = image
Me.Font = font
End Sub
Public Sub New()
End Sub
Private _Font As Font = New Font("Arial", 10)
Public Property Font() As Font
Get
Return _Font
End Get
Set(ByVal value As Font)
_Font = value
End Set
End Property
Private _Image As Image
Public Property Image() As Image
Get
Return _Image
End Get
Set(ByVal value As Image)
_Image = value
End Set
End Property
End Class
/// Конвертер дляclass
Public Class Class1Converter
Inherits ExpandableObjectConverter
Public Overrides Function GetCreateInstanceSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
Return True
End Function
Public Overrides Function CreateInstance(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal propertyValues As System.Collections.IDictionary) As Object
Dim font As Font = TryCast(propertyValues("Font"), Font)
Dim image As Image = CType(propertyValues("Image"), Image)
Return New Class1(font, image)
End Function
End Class
/// Кнопка для размещения класса
Public Class MyButton
Inherits Button
Private _C As Class1 = New Class1
Public Property C() As Class1
Get
Return _C
End Get
Set(ByVal value As Class1)
_C = value
End Set
End Property
End Class