にバインドDataGrid
する必要があります
ICollectionView = CollectionViewSource.GetDefaultView(collection)
またはに
ObservableCollection<T> collection;
???
MVVMのベストプラクティスとその理由は何ですか?
にバインド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自体の一部ではありません。
グリッドにビューに適用された設定(フィルタリングなど)を表示する場合は、ビューにバインドします。それ以外の場合、ビューは冗長です。