2012-04-11 30 views
1

我想模仿一個ListView和其他控件處理SelectedItems集合的方式。我有一個包含項目集合的類,每個項目都有一個Selected屬性。SelectedListViewItemCollection如何實現IList但不具有Add()?

我想模仿項目可以更改其自己的Selected屬性的智能行爲,這樣做會在父類中引發SelectedItemsChanged事件,而SelectedItems集合現在應該反映更改。

我想實現一個SelectedItemsCollection類,它不包含內部列表,而是檢查主項目列表中每個項目的Selected狀態。這種方式不需要不斷更新並與主列表同步。

我一直在尋找的ListView.SelectedListViewItemCollection元數據,它具有以下聲明:

public class SelectedListViewItemCollection : IList, ICollection, IEnumerable 

它沒有實現添加,刪除,RemoveAt移除,等等。這不是針對使用規則IList接口?沒有實施它們,我無法編譯。這只是元數據創建過程中的一個小故障嗎?

我應該如何去模擬這個功能?

回答

3

這些方法實施explicitly
例如拆卸與ILspy類,你可以看到Add()方法是這樣實現的:如果你有SelectedItemsCollection一個實例,並要調用Add()方法

int IList.Add(object value) 
{ 
    throw new NotSupportedException(); 
} 

所以,舉例來說,你必須將對象投射到IList例如:

((IList)mySelectedItemsCollection).Add(...) 

是的,如果您通過Visual Studio查看該類的元數據,則顯式實現的方法將被隱藏。

關於Selected屬性......以及「詭計」是每個項目都有一個對它所屬的ListView的引用。當Selected屬性發生更改時,該項目將調用SetSelectedState()方法的listView,引發SelectedChanged事件。

另外SelectedItemsCollection創建經過ListView參考在構造函數,以這種方式的元件的枚舉是ListView中的內構件,其從SelectedItemsCollection訪問,因爲它是一個嵌套類上實際執行。

+0

增加了對「Selected」和「SelectedItemsCollection」工作方式的一點說明。 – digEmAll 2012-04-11 17:37:20

相關問題