web-dev-qa-db-ja.com

ICollectionViewまたはObservableCollectionにバインドする必要があります

DataGridをバインドする必要があります

ICollectionView = CollectionViewSource.GetDefaultView(collection)

または

ObservableCollection<T> collection; ???

MVVMのベストプラクティスとその理由は何ですか?

79
Cartesius00

明示的であるかどうかに関係なく、ICollectionViewに常にバインドします

私たちが持っていると仮定します

var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);

この場合、collectionまたはcollectionViewへのバインドはまったく同じです。バインドエンジンは、デフォルトのコレクションビュー(collectionViewと等しい参照)にバインドします。 collectionにバインドします。

これは、あなたの質問に対する答えが「まったく違いがない」ことを意味します。

明確にするために、コレクションに直接バインドする場合でも、バインディングエンジンはデフォルトビューにバインドします。ソート基準などのビューのプロパティを変更すると、コレクションに直接バインドされているように見えるバインディングに影響します。カバーの背後ではデフォルトビューへのバインディングであるためです。

ただし、別の興味深い関連する質問があります:デフォルトのコレクションビュー(つまり、デフォルトビューに明示的にバインドする理由がないため、コレクション自体にバインドする)または同じコレクションの別のビューにバインドする必要がありますか?

各ビューに現在のアイテム、ソート基準などの独自の概念があることを考慮すると、同じコレクションに複数のバインディングを設定する場合、バインドされたコントロールには現在のアイテム、フィルター、会社の別個の概念が必要です。必要なのは、同じ基になるコレクションの複数のビューに明示的にバインドすることです。

122
Jon

ObservableCollection<T>INotifyCollectionChangedを実装し、コレクション内のアイテムが変更されたときにUIに通知します。

ICollectionViewは、基になるコレクションが実装している場合、INotifyCollectionChangedイベントを伝播することに加えて、コレクションをフィルター、ソート、またはグループ化する機能を提供します。

どちらのタイプも、バインドする限りMVVMで適切に機能します。並べ替え、フィルタリング、またはグループ化が必要な場合は、ICollectionViewを使用します。つかいます ObservableCollection<T>しない場合は直接。

32
Jimmie R. Houts

ジョンが言ったことに付け加えるだけです。主な違いは、CollectionViewSource.GetDefaultView(collection)を使用することにより、ViewModelをWPFに依存させることです。多くのMVVM純粋主義者はこれを好まないため、ObservableCollectionのみが有効なオプションになります。

他のオプションは、ICollectionViewを使用し、それを実装するクラスを使用することですが、WPF自体の一部ではありません。

9
Euphoric

MVVM自体で何かをする必要があるとは思わない。 ICollectionViewは、必要に応じてIColectionViewを使用する必要がある場合、グループ化などの追加機能を提供します。そうでない場合は、単にObservableCollectionを使用します

7
Haris Hasan

グリッドにビューに適用される設定を表示する場合は、ビューにバインドします。それ以外の場合、ビューは冗長です。

2
devdigital