在设计时刷新属性网格,当只读集合在 .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 中更改时的主要内容,如果未能解决你的问题,请参考以下文章

刷新数据网格视图的问题

在 asp.net 中执行回发操作后刷新页面

仅在编辑单击时将 ReadOnly 属性设置为 devexpress 网格(MVC)的列

WPF 数据网格绑定工具提示在表格内容绑定刷新时闪烁

.NET不可变集合已经正式发布

更新数据源时刷新数据网格