簡體   English   中英

重寫ComboBox.Items的最佳方法

[英]Best Way to Override ComboBox.Items

我創建了一個繼承自ComboBox的所有者繪制用戶控件。

該控件存儲特殊項目,但是Items集合仍接受並返回Object類型的項目。 關於覆蓋此集合以確保其類型安全的最佳方法的任何技巧?

我能想到的唯一方法是創建自己的集合類。 該類將不是一個真正的集合,它將一個ObjectCollection作為構造函數的參數,並簡單地將其方法擴展到。

用戶控件會將原始的Items集合傳遞給新類的構造函數。 然后重寫Items屬性以返回新類的實例。

這似乎有些令人費解。 有沒有更好的辦法?

您可以通過幾種不同的方式來做到這一點。 首先,我對您創建一個從ComboBox繼承的“用戶控件”感到有些困惑。 您可以創建從ComboBox繼承的自定義控件 ,但是不能同時從UserControl(這是“用戶控件”的通常定義)和ComboBox繼承。

如果您定義了一個真正的UserControl派生類,這會變得容易一些。 就像我說的,UserControl不能 ComboBox,但是可以具有 ComboBox。 因此,您可以將ComboBox拖放到UserControl曲面上,然后重新實現需要使用的所有屬性,例如Items。 這將使您可以重新創建項目作為您選擇的集合,可能是強類型的列表。 唯一的問題是確切知道要重新實現的內容。 ComboBox有很多有用的屬性,除非您實現了一個“傳遞”屬性,該屬性可以修改UserControl中包含的ComboBox,否則您將無法在Designer或代碼中訪問它。

如果直接從ComboBox繼承,則它在某些方面會變得有些欺騙,而在其他方面則更容易。 您可以通過定義自己的項目並使用new關鍵字來隱藏Items的基類實現。 您可以在執行此操作時更改可見性,類型和其他修飾符。 這將防止與作為CustomComboBox(或您命名的控件)的控件一起處理的代碼使用基類上的對象數組。 他們必須使用您的強類型Items數組。 您的新媒體資源仍可以訪問舊媒體資源(為了使其正常工作,需要訪問該媒體資源)。 您還可以免費獲得ComboBox的所有其他公共屬性; 您只需重新實現要更改的內容。 但是,將您的自定義ComboBox稱為任何基類將導致運行時使用對該類有效的Items版本。 即對象數組,而不是您的強類型數組。

暫無
暫無

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

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