【发布时间】:2011-01-23 05:33:07
【问题描述】:
我有一个具有只读集合属性的类 - 它是已应用于控件的扩展器提供程序的列表。
我已经为集合实现了一个简单的属性描述符,以便可以在属性网格中展开该属性来检查每个条目。
当我选择扩展器提供程序并将其设置为 false 时,我会将其从集合中删除。请求类型转换器的GetProperties方法,刷新属性网格。
但是,当我将扩展程序提供程序设置为 true 并因此将其添加到集合中时,不需要 GetProperties。
不知何故,属性网格区分了添加到集合和从集合中移除。或者,在添加扩展提供程序时它会刷新,但在删除扩展提供程序时不会刷新。
当我添加到集合时,如何让网格刷新?
我尝试过 INotifyPropertyChanged 和 (PropertyName)Changed,但没有成功。
预计到达时间:
我拼凑了一个小样本来证明我的问题。为简洁起见,此示例使用了一个数组,并且将持续存在,尽管不正确。不过,这不会影响设计时的行为:
Public Class MyButton
Inherits Button
Private _Col As String()
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property Col() As String()
Get
Return Me._Col
End Get
End Property
Private _AlterCol As String
''''''<RefreshProperties(RefreshProperties.All)> _
Public Property AlterCol() As String
Get
Return _AlterCol
End Get
Set(ByVal value As String)
_AlterCol = value
ReDim Preserve Me._Col(Me._Col.Length)
Me._Col(Me._Col.Length - 1) = value
End Set
End Property
Public Sub New()
ReDim Me._Col(2)
Me._Col(0) = "Fred"
Me._Col(1) = "Jim"
Me._Col(2) = "Bob"
End Sub
End Class
现在,要查看实际行为,请将 MyButton 添加到表单,展开 Col 属性并在 AlterCol 属性中键入一些文本。
Col 中展开的子属性不会改变。但是,将 RefreshProperties.All 注释掉,它会被重新查询和更新。
我的问题是我没有从读/写属性更新 Col。我正在更新它以响应添加的外部提供商。
我需要强制属性网格以某种方式刷新。 我能想到的唯一方法是使用 RefreshProperties 装饰的虚拟属性,我将更改的值分配给它。
有什么想法吗?
【问题讨论】:
-
@Jules:为了我们的利益,看看一些代码可能是值得的,这样我们就可以帮助查明或找出问题的根源?
-
我稍后会尝试收集一个小样本
标签: c# .net vb.net refresh propertygrid