在设计时刷新属性网格,当只读集合在 .Net、Winforms 中更改时
Posted
技术标签:
【中文标题】在设计时刷新属性网格,当只读集合在 .Net、Winforms 中更改时【英文标题】:Refresh property grid, at Design-time, when a readonly collection changes in .Net, Winforms 【发布时间】: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:为了我们的利益,看看一些代码可能是值得的,这样我们就可以帮助查明或找出问题的根源? 我稍后会尝试收集一个小样本 【参考方案1】:您是否捕获了 INotifyPropertyChanged...在收到事件后您可能需要“断开”属性网格、重新设置并刷新它...或者您没有捕获属性网格的“PropertyChanged”事件?我是 C# 人...所以这可能对您毫无用处...?
// 在 INotifyPropertyChanged 事件处理程序的陷阱中 // 将'SelectedObject'设置为null propGrid.SelectedObject = null; // propGrid.SelectedObject = 这个对象 // propGrid.Refresh();这是一个捕获 Property Changed 的示例......
私人无效propGrid_PropertyValueChanged(对象s,PropertyValueChangedEventArgs e) // 处理 'propGrid' 组件的属性更改编辑: 正如 Jules 所指出的,这样做的必要性是在设计时,所以四处挖掘我发现了一些可能对CodeProject 有所启发...这里解释了如何利用用于控件的“Extendee”的usage...以便深入了解问题。
听起来您需要使类成为扩展对象并在运行时将其绑定到属性网格...
也可以在这里查看CodeProject 上的 IExtenderProvider,它解释了如何使用 CSS 样式表并将其应用于 Windows 窗体...
希望这会有所帮助, 最好的祝福, 汤姆。
【讨论】:
嗨,我应该更清楚。这是在设计时,所以我无法访问 PropertyGrid Refresh 方法。我已经修改了标题以澄清。以上是关于在设计时刷新属性网格,当只读集合在 .Net、Winforms 中更改时的主要内容,如果未能解决你的问题,请参考以下文章