在设计时刷新属性网格,当.Net,Winforms中的只读集合发生变化时

时间:2010-03-03 13:59:56

标签: c# .net vb.net refresh propertygrid

我有一个具有只读集合属性的类 - 它是一个已应用于控件的扩展程序提供程序列表。

我为集合实现了一个简单的属性描述符,以便可以在属性网格中扩展属性以检查每个条目。

当我选择扩展程序提供程序并将其设置为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修饰的虚拟属性,我将更改后的值分配给。

有什么想法吗?

1 个答案:

答案 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窗体......

希望这有帮助, 最好的祝福, 汤姆。