繁体   English   中英

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

[英]RefreshProperties attribute at class level in .net, winforms + incorrectly refreshing property grid

我在属性网格中编辑类时遇到了一个奇怪的问题,即属性网格将无法正确刷新。

我设法将问题简化为只有两个属性的类。 为了方便说明,我在最后添加了代码。

它基本上可以归结为具有两个属性的类。 第一个是可扩展的(字体)。 该类本身是可扩展的,并且还在类型转换器中实现CreateInstance方法。

要查看该问题,请展开字体,进行编辑,说“粗体”,然后移开标签。 发生两个问题:

(1)第二个属性跳转并在扩展的font属性中结束。

(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

末级

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

该问题可能消失的原因之一是,在类级别应用RefreshPropertiesAttribute并不是应该使用该属性的方式。 我猜想,通过在班级应用它,您可以有效地删除它。 看起来他们将其设置为AttributeTargets.All但显然这不是设计使然。

RefreshProperties是一种保护属性。 它告诉设计者,当此属性的值更改时(通过属性网格),请重新查询该类上的所有其他属性。 显然,这是一种浪费,特别是如果已更改的属性对任何其他属性都没有任何影响。

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

但是在您给出的示例中,这两个属性不会彼此无效,因此您无需使一个属性无效即可响应另一个属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM