10

アイテムのリストを表示し、テキストボックスに入力してこのリストをフィルタリングする機能を提供する wpf アプリケーションを実装しています (非常に簡単なユースケースだと思います)。

MVVM 構造を使用しています。

私の質問は、リストをフィルタリングするのは誰の責任ですか? ビューまたはビューモデル? xaml.cs で "OnTextChanged" イベントを実装する必要がありますか、または ViewModel でプロパティを使用し、PropertyChanged を使用してリストをフィルター処理する必要があります。
フォローアップの質問は、ViewModel で BindingList/ObservableCollection を使用する必要がありますか、それとも ICollectionView を使用して ItemsControl をバインドする必要がありますか?

両方の方法を試しましたが、どちらも機能します。ViewModel に責任を与えると、View の背後にあるコードは空のままになりますが、一方で、フィルタリングを適用するのが ViewModels の責任であるとは完全には確信していません (たとえば、ビューごとに異なるフィルタリングが必要になる場合があります)。

何かご意見は?

ありがとう、ロエル

編集:

それをViewModelに入れることについて私を悩ませているのは、(私の現在の実装では)System.Windows.Dataへの参照があるということです。これは明らかに View に関連するものであるため、ViewModel には含めたくないリファレンスです。または、何か不足していますか?関連コード:

ICollectionView customerView = CollectionViewSource.GetDefaultView(customers);
4

5 に答える 5

4

MVVM 手法を使用してアイテムのコレクションをフィルター処理している私のブログの記事をご覧ください。これは間違いなく VM クラスの責任だと思います。

于 2009-10-16T08:54:23.790 に答える
3

この種のフィルタリング機能はビューモデルに属していると思います。ビューモデルにはできるだけ多くのテスト可能なコードを保持する必要があることを忘れないでください (ユニットテストを行いますよね?)。逆に、無駄のない平均的なビューを維持する必要があります。

フィルタリング機能は一般的なものであり、ビュー自体にはバインドされていません。ただし、別のビューで別のフィルタリングが必要な場合は、ビューモデルでサポートされている追加機能としてそれを確認する必要があります。

于 2009-10-16T08:37:51.373 に答える
0

VieModel に View 技術の漏れがあるのは困っているというあなたの意見に同意します。同様に、System.Windows.Input を使用する ViewModel で RelayCommand オブジェクトを使用します。

ただし、ここに掲載されているすべての理由から、完璧とは言えませんが、ViewModel はこの媒体 (wpf/silverlight) の正しい設計選択であると思います。

于 2009-10-27T17:52:26.953 に答える