2013-10-29 39 views
2

我創建了一個擴展基類ListView.ColumnHeaderCollection(發現於System.Windows.Forms)的類,我希望能夠通過INotifyCollectionChanged收到何時更改集合的通知。實現(不處理)CollectionChanged事件

到目前爲止,我有:

public class MyCollection : ListView.ColumnHeaderCollection, INotifyCollectionChanged { ... } 

在我的初始化方法中,我指定委託我自己的方法OnCollectionChanged()

UserSettings.Instance.Columns.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(OnCollectionChanged); 

對於那些誰是好奇,我委託的樣子:

public void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    Settings_Save(); 
} 

因此,我們在我的問題到達。我不知道如何實現INotifyCollectionChanged所需的接口成員。

'_Namespace_.MyCollection' does not implement interface member 'System.Collections.Specialized.INotifyCollectionChanged.CollectionChanged' 

非常感謝這個C#新手!

回答

4

根據INotifyCollectionChanged,它需要一個名爲CollectionChanged的公共事件成員在實現類中。即:

public class MyCollection : INotifyCollectionChanged 
{ 
    public event NotifyCollectionChangedEventHandler CollectionChanged; 
    // ... 
} 

編輯:重寫使用new關鍵詞非虛擬財產:

public class MyListView : ListView 
{ 

    public new MyCollection Columns { get; set; } 
    //... 

} 

但是你必須要小心。如果引用類型引用ListView.Columns,它將與MyCollection.Columns不同,並導致意外行爲。當使用new覆蓋您應該設置一個基礎屬性/得到基礎屬性,這樣可以保留收藏的完整性,即:

public class MyListView : ListView 
{ 
    public new MyCollection Columns 
    { 
     get 
     { 
      return base.Columns as MyCollection; 
     } 
     set 
     { 
      base.Columns = value; 
     } 
    } 
} 
+0

謝謝@Xenolightning!鑑於我給出的錯誤,這並不是很明顯。 –

+0

Upvoted儘管#區域的東西。 –

+0

進一步的問題......我正在實現'ListView.ColumnHeaderCollection'的子類(在'System.Windows.Forms'命名空間中找到),部分原因是我想接收'CollectionChanged()'的通知,但是,我無法重寫我打算的屬性('ListView.ColumnCollection Columns'),因爲它沒有被定義爲'virtual'。有沒有其他方法可以覆蓋房產以獲得相同的預期效果? –

相關問題