.net中类级别的RefreshProperties属性,winforms +错误刷新属性网格

时间:2010-02-15 22:09:20

标签: c# .net vb.net winforms propertygrid

在编辑属性网格中的类时出现了一个奇怪的问题,即属性网格会刷新错误。

我设法将问题减少到只有两个属性的类。我在最后加入了代码以便于解释。

它基本上归结为具有两个属性的类。第一个是可扩展的(字体)。 类本身是可扩展的,并且还在类型转换器中实现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

///类的转换器

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

结束班

1 个答案:

答案 0 :(得分:0)

听起来发生的事情是属性网格控件中的绘图错误。发生错误时,是否在属性级别应用了RefreshPropertiesAttribute?组件是否实现了INotifyPropertyChanged?

问题可能消失的一个原因是在类级别应用RefreshPropertiesAttribute不是该属性应该使用的方式。我猜测通过在课堂级别应用它,你可以有效地删除它。看起来他们把它设置为AttributeTargets.All但显然不是设计。

RefreshProperties是一种cop-out属性。它告诉设计者,当此属性的值发生更改时(通过属性网格),请重新查询此类中的每个其他属性。显然这是浪费,特别是如果改变的财产对任何其他财产没有任何影响。

如果您确实具有导致其他属性更改的属性,则可以使用 PropName 已更改事件模式。在这种情况下,当这些属性发生更改时,您将在类上引发FontChanged或ImageChanged事件。 Windows窗体设计器使用该命名约定查找事件,并使用它们使属性网格无效。

但是在你给出的例子中,这两个属性不会互相失效,因此你不需要为了响应另一个而使其中一个无效。