5

の.NetインターフェイスがないのはなぜICollectionView<T>ですか?それを見ると、ICollectionViewを期待するのは非常に明白なようですICollectionView<T>

私は何かが足りないのですか?

4

1 に答える 1

3

ICollectionViewは、CollectionViewクラスによってのみ実装されます。MSDNのドキュメントでは、CollectionViewをコードでインスタンス化することすらすべきではなく、代わりにCollectionViewSourceオブジェクトを使用してコレクションビューを取得する必要があると指摘しています。

Tの独自のコレクションをCollectionViewに返す場合は、独自のコレクション(IEnumerableを実装)をCollectionViewSourceオブジェクトに追加し、そこからCollectionViewを取得する必要があります。次に例を示します。

    List<MyClass> listToView = new List<MyClass>();
    MyClass x1 = new MyClass() { Name = "Fictive Name 1", Description = "Description...", Date = DateTime.Now};
    MyClass x2 = new MyClass() { Name = "Fictive Name 2", Description = "Description...", Date = DateTime.Now};
    MyClass x3 = new MyClass() { Name = "Fictive Name 3", Description = "Description...", Date = DateTime.Now};
    listToView.Add(x1);
    listToView.Add(x2);
    listToView.Add(x3);

    CollectionViewSource collectionViewSource = new CollectionViewSource();
    collectionViewSource.Source = listToView;
    ICollectionView collectionView = collectionViewSource.View;

TのICollectionViewがない理由は、おそらくそのように設計されていないためです。ドキュメントは、CollectionViewがコレクションを変更せずに異なるビューを提供するように設計されていることを指摘しています。

コレクションビューは、バインドされたソースコレクションの上のレイヤーと考えることができます。これにより、基になるソースコレクション自体を操作しなくても、並べ替え、フィルター、およびグループクエリに基づいてコレクションをナビゲートおよび表示できます。

その点で、コレクションのみを表示できることは理にかなっているため、「ViewCollection」という名前が付けられています。

CollectionViewはそもそもインスタンス化されることを意図していないため、TのICollectionViewを期待することはそれほど明白ではないと思います(いくつかの並べ替え機能を追加した後、以下の興味深い警告を参照してください)。

System.Windows.Data警告:52:CollectionViewを直接使用することは完全にはサポートされていません。基本的な機能は機能しますが、非効率的ですが、高度な機能では既知のバグが発生する可能性があります。これらの問題を回避するには、派生クラスの使用を検討してください。

アーキテクチャは、基になるデータソースを変更せずに「読み取り専用」ベースのレベルで機能するように設計されていると思います。これは、データコレクションのグループ化、フィルタリング、およびナビゲートが主に焦点を当てているためです。

ただし、その理由を正確に知りたい場合は、フレームワークのこの部分に取り組んでいるMicrosoftの誰かと話をする必要があります。

于 2012-10-21T13:27:03.713 に答える