2010-02-15 45 views
0

我有一個奇怪的問題編輯屬性網格中的類,其中屬性網格將不正確刷新。在.net中的類級別的RefreshProperties屬性,winforms +不正確地刷新屬性網格

我設法將問題簡化爲只有兩個屬性的類。我在最後包含了代碼以簡化解釋。

它基本上歸結爲具有兩個屬性的類。第一個是可擴展的(一種字體)。 該類本身是可擴展的,並且在類型轉換器中實現了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 

/// A按鈕來承載類

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 

末級

回答

0

聽起來像是在發生什麼g是屬性網格控件中的繪畫錯誤。發生錯誤時是否在屬性級應用了RefreshPropertiesAttribute?該組件是否實現INotifyPropertyChanged?

問題可能消失的一個原因是,在類級別應用RefreshPropertiesAttribute並不是該屬性應該使用的方式。我猜測,通過在課堂上應用它,您可以有效地將其移除。看起來他們將它設置爲AttributeTargets.All,但顯然這不是按設計。

RefreshProperties是一種cop-out屬性。它告訴設計者,當這個屬性的值改變時(通過屬性網格),去重新查詢這個類的所有其他屬性。顯然這是浪費的,特別是如果改變的財產對任何其他財產沒有任何影響。

如果您確實有導致其他屬性發生更改的屬性,則可以使用 PropName更改的事件模式。在這種情況下,當這些屬性更改時,您將在類上引發FontChanged或ImageChanged事件。 Windows窗體設計器使用該命名約定查找事件,並使用它們使屬性網格無效。

但是在你給出的例子中,這兩個屬性不會使對方無效,因此你不需要使任何一個對另一個無效。