2009-06-11 8 views
36

私はMVVMパターンを使用してWPFアプリケーションを開発しています。選択した項目のフィールドをマスター/詳細ビューに表示して、ListViewに項目のリストを表示する必要があります(フィルタリングあり)。私はこれを行うには、次の2つの方法の間で引き裂かれています:MVVM:ViewModelのCollectionViewまたはxamlのCollectionViewSource?

  1. は私のViewModelにCollectionViewを公開し、これに結合します。
  2. ViewModelにプレーンIListを公開し、CollectionViewSourceを使用してCollectionViewをXAMLに作成します。

これを行う方法はありますか?最善の方法の考え?

+1

誰かがあなたが尋ねようとしていたのと同じ質問を既にしていることが分かったことは驚くべきことです。ありがとう! :) –

答えて

30

私は前者を行いますが(VMからCollectionViewを公開します)、本当に重要なことは、フィルタリングロジックがどこにあるかです。これは、たとえビューがVMにCollectionViewSourceを結びつけなければならないとしても、VMに確実にテストできるようにする必要があります。つまり、私は、あなたのVMからCollectionViewを公開することについて特に嫌なことや反MVVMはないと思います。

+0

ViewModelで新しいCollectionViewを作成するだけですか? CollectionViewのMSDNでは、新しいCollectionViewを作成するのではなく、CollectionViewSourceを作成してデフォルトのビューを取得するようにしてください。 CollectionViewを作成する最良の方法は何ですか? –

+0

MSDNでは、コード内で実行する最良の方法についてはっきりしていません。私はちょうどCollectionViewサブクラスを直接作成する(例えばListCollectionView)が、私はあなたもCollectionViewSourceを使うことができると思います。私の理解は、CVSはあなたのための適切なCVサブクラスの選択を行い、XAMLサポートを提供することです。自分でCVを作成する際に問題はありませんでした。コードで行い、ラッピングするコレクションの型をすでに知っているときは意味があるようです。 –

+0

バインド時にWPFが自動的にビューを作成することを忘れないでください。たとえば、IListにバインドするときにListCollectionViewを取得します。これにはすでにソート/フィルタリング/グループ化機能がありますが、バインドしているオブジェクトのItemsコレクションを取得することに依存しています。代わりに、var view = CollectionViewSource.GetDefaultView(yourCollection)をListCollectionViewとして使用できます。それから、あなたはあらゆる種類のクールなことをすることができます。 – Stimul8d

3

私はあなたの質問に少し遅れて答えるが、私は今日それを見た。

私は、CollectionViewSourceを使用し、ブログを作成したマスター/詳細ビューモデルを作成しました。

私が使用していることを、ここでマスター/ディテール表のためのviewmodelについて書いた: http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html

あなたはまた、私のブログのページ上のObservableCollectionクラスののviewmodelを見つけることができます。

多分あなたはそれをあなたに利用しているでしょう。

関連する問題