DataGrid
をバインドする必要があります
ICollectionView = CollectionViewSource.GetDefaultView(collection)
または
ObservableCollection<T> collection;
???
MVVMのベストプラクティスとその理由は何ですか?
明示的であるかどうかに関係なく、ICollectionView
に常にバインドします。
私たちが持っていると仮定します
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
この場合、collection
またはcollectionView
へのバインドはまったく同じです。バインドエンジンは、デフォルトのコレクションビュー(collectionView
と等しい参照)にバインドします。 collection
にバインドします。
これは、あなたの質問に対する答えが「まったく違いがない」ことを意味します。
明確にするために、コレクションに直接バインドする場合でも、バインディングエンジンはデフォルトビューにバインドします。ソート基準などのビューのプロパティを変更すると、コレクションに直接バインドされているように見えるバインディングに影響します。カバーの背後ではデフォルトビューへのバインディングであるためです。
ただし、別の興味深い関連する質問があります:デフォルトのコレクションビュー(つまり、デフォルトビューに明示的にバインドする理由がないため、コレクション自体にバインドする)または同じコレクションの別のビューにバインドする必要がありますか?
各ビューに現在のアイテム、ソート基準などの独自の概念があることを考慮すると、同じコレクションに複数のバインディングを設定する場合、バインドされたコントロールには現在のアイテム、フィルター、会社の別個の概念が必要です。必要なのは、同じ基になるコレクションの複数のビューに明示的にバインドすることです。
ObservableCollection<T>
はINotifyCollectionChanged
を実装し、コレクション内のアイテムが変更されたときにUIに通知します。
ICollectionView
は、基になるコレクションが実装している場合、INotifyCollectionChanged
イベントを伝播することに加えて、コレクションをフィルター、ソート、またはグループ化する機能を提供します。
どちらのタイプも、バインドする限りMVVMで適切に機能します。並べ替え、フィルタリング、またはグループ化が必要な場合は、ICollectionView
を使用します。つかいます ObservableCollection<T>
しない場合は直接。
ジョンが言ったことに付け加えるだけです。主な違いは、CollectionViewSource.GetDefaultView(collection)
を使用することにより、ViewModelをWPFに依存させることです。多くのMVVM純粋主義者はこれを好まないため、ObservableCollectionのみが有効なオプションになります。
他のオプションは、ICollectionView
を使用し、それを実装するクラスを使用することですが、WPF自体の一部ではありません。
MVVM
自体で何かをする必要があるとは思わない。 ICollectionView
は、必要に応じてIColectionView
を使用する必要がある場合、グループ化などの追加機能を提供します。そうでない場合は、単にObservableCollection
を使用します
グリッドにビューに適用される設定を表示する場合は、ビューにバインドします。それ以外の場合、ビューは冗長です。