2012-02-21 21 views
2

これはそれほど疑問ではなく、私には奇妙なものがあります。ObservableCollectionクラスは一般的ですが、コレクションに変更すると発生するCollectionChangedイベントは発生しません。つまり、イベントハンドラ内では、イベントargsオブジェクトから取得したNewItems/OldItemsコレクション内のすべてのオブジェクトを、自分で適切なアイテムタイプにキャストする必要があります。C#:ObservableCollection - 汎用の "CollectionChanged"イベントはありませんか?

しかし、単純にそのイベントを一般的にすることはできませんでしたか?

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

し、すべての後

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

public virtual event NotifyCollectionChangedEventHandler<T> CollectionChanged; 

ような何か、型パラメータTは、すでにあなたはいけ意味し、問題のObservableCollectionの宣言によって決定されますとにかくタイプT(または互換性のないオブジェクト)をコレクションに追加することができます。だからこそすべての型は完全に型の安全でなければならず、イベントハンドラの中のオブジェクトを、どうにかしてはいけないことがわかっているどのような型にもキャストする必要がありません。

私が行方不明になったこのような理由はありますか?私。これは意識的なデザインの欲望か、あるいは単に見落としですか?

+1

私が正しくリコール(しかし、私は非常によく間違っているかもしれない)、これはジェネリックで動作することができませんでしたWPFとは何かを持っていますが、コレクションの変更を監視する方法を知っておく必要がある場合(のObservableCollectionをWPFのために導入され、 – Polity

答えて

-1

INotifyCollectionChangedインターフェイスは、INotifyPropertyChangedと共に、WPFフレームワーク専用に設計されています。 WPFはゆるやかに型付けされているので、私はジェネリックがそのデザインの一部ではないと推測しています。私はINotifyCollectionChangedが直接消費されるように設計されていたとは思わない。一方、ObservableCollection<T>は、強く型付けされたC#コードによって消費されるように設計されているため、デザインにはジェネリックが含まれています。

+4

)それは理にかなっているように、それは最も確かにWPFのために専用に設計されていなかったので、基本的に 'INotifyPropertyChanged'は、.NET 2.0の中に導入されました。 – Lukazoid

+0

INotiftPropertyChangedは、元のWindowsフォームのデータバインドのために、IErrorInfoの横に追加されました。バインド元は、 'Object'タイプのみを処理します。 –

関連する問題