我有一个具有只读集合属性的类 - 它是一个已应用于控件的扩展程序提供程序列表。
我为集合实现了一个简单的属性描述符,以便可以在属性网格中扩展属性以检查每个条目。
当我选择扩展程序提供程序并将其设置为false时,我将其从集合中删除。将重新获取类型转换器的GetProperties方法,并刷新属性网格。
但是,当我将扩展程序提供程序设置为true并将其添加到集合时,不会重新获取GetProperties。
不知何故,属性网格正在区分添加和删除集合。或者替代地,它在添加扩展程序提供程序时刷新,但在删除时不会刷新。
如何在添加到集合时刷新网格?
我已经尝试过INotifyPropertyChanged和(PropertyName)已更改,但没有成功。
ETA:
我敲了一小样来证明我的问题。为简洁起见,此示例使用数组并将保持不变,但不正确。这不会影响设计时的行为:
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修饰的虚拟属性,我将更改后的值分配给。
有什么想法吗?
答案 0 :(得分:0)
您是否正在捕获INotifyPropertyChanged ...收到事件后您可能需要“断开”属性网格,重新设置并刷新它...或者您是否正在捕获属性网格的“PropertyChanged”事件?我在这里是一个C#家伙...所以这可能对你没用......?
// Within your trapping of the INotifyPropertyChanged Event Handler // Set 'SelectedObject' to null propGrid.SelectedObject = null; // propGrid.SelectedObject = this object // propGrid.Refresh();
以下是捕获属性更改的示例....
private void propGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { // Handle the property changed for the 'propGrid' conmponent }
编辑正如 Jules 所指出的,需要这样做是在设计时,所以挖掘我发现了一些东西可能在CodeProject上有启发......在这里它解释了如何利用用于控制的'{3}}'Extendee'来深入了解问题。
听起来你需要让这个类成为extendee并在运行时将它绑定到属性网格......
另请参阅usage上的IExtenderProvider,了解如何使用CSS样式表并将其应用于Windows窗体......
希望这有帮助, 最好的祝福, 汤姆。