2012-02-21 53 views
2

這不是一個問題,更多的東西讓我覺得奇怪:ObservableCollection類是通用的,但是在更改爲集合時引發的CollectionChanged事件不是。這意味着在事件處理程序中,您必須將您從事件參數對象獲得的集合中的所有對象都轉換爲適當的項目類型。C#:ObservableCollection - 爲什麼沒有通用的「CollectionChanged」事件?

但是,不應該簡單地將該事件設置爲通用的嗎?喜歡的東西

public virtual event NotifyCollectionChangedEventHandler<T> CollectionChanged; 

public delegate void NotifyCollectionChangedEventHandler(object sender, NotifyCollectionChangedEventArgs<T> e); 

然後

public class NotifyCollectionChangedEventArgs<T> { 
    // ... 
    public IList<T> NewItems { get; } 
    public IList<T> OldItems { get; } 

畢竟,類型參數T由有關ObservableCollection的聲明,這意味着你永遠不應該已經確定無論如何都可以將任何類型不是T(或兼容)的對象添加到集合中。因此,所有這些應該是完全類型安全的,並且節省我們不得不將事件處理程序內的對象轉換爲我們知道它們應該擁有的任何類型的麻煩。

有沒有理由不這樣做,我失蹤了?即這是一個有意識的設計desicion,或者只是一個疏忽?

+1

如果我記得沒錯(但我很可能是錯的),這與WPF有關,它無法使用泛型,但需要知道如何聽集合更改(ObservableCollection是爲了WPF而引入的基本上這是有道理的) – Polity 2012-02-21 13:19:43

回答

-1

INotifyCollectionChanged接口以及INotifyPropertyChanged專門設計用於WPF框架。由於WPF是鬆散類型的,我猜測泛型不是該設計的一部分。我不認爲INotifyCollectionChanged被設計爲直接消耗。然而,ObservableCollection<T>被設計爲被C#代碼佔用,而C#代碼是強類型的,因此設計中使用了泛型。

+4

'INotifyPropertyChanged'在.NET 2.0中引入,所以它絕對不是專門爲WPF設計的。 – Lukazoid 2012-02-21 13:24:44

+0

INotiftPropertyChanged與IErrorInfo一起引入,用於原始窗體中的數據綁定。綁定源僅處理「對象」類型。 – 2012-02-21 13:41:28

相關問題