簡體   English   中英

在.Net,Winforms中更改只讀集合時,在設計時刷新屬性網格。

[英]Refresh property grid, at Design-time, when a readonly collection changes in .Net, Winforms

我有一個具有只讀集合屬性的類-它是已應用於控件的擴展程序提供程序的列表。

我為集合實現了一個簡單的屬性描述符,以便可以在屬性網格中擴展屬性以檢查每個條目。

選擇擴展程序提供程序並將其設置為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,它將被重新查詢和更新。

我的問題是我沒有從Read / Write屬性更新Col。 我正在更新它,以響應添加的外部提供程序。 我需要強制屬性網格以某種方式刷新。 我能想到的唯一方法是使用RefreshProperties裝飾的虛擬屬性,然后向其分配更改的值。

有任何想法嗎?

您是否正在捕獲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有所啟發...在這里,它解釋了如何利用控件的“擴展名”的用法 ...以深入了解問題。

聽起來您需要使該類成為擴展對象並將其在運行時綁定到屬性網格...

在這里也可以在CodeProject上了解IExtenderProvider,它解釋了如何使用CSS樣式表並將其應用於Windows窗體...

希望這對您有所幫助,湯姆,謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM