1

私はMVVMパターンを使い始めようとしていますが、この問題に苦労しています。

検索フィルターの値を入力する入力フィールドがあります。値を覚えておきたいので、通常はアプリケーションの設定に保存します。

入力フィールドは、ビューの設定に2方向にバインドされます。これは正常に機能し、ViewModelにアプリケーションの依存関係を作成しません。これはユニットテストにとって重要だと思います。

ここで、入力フィールドの変更に応答してフィルターを適用したいのですが、バインディングはアプリケーション設定であり、ViewModelではありません。

どうすればこの問題を解決できますか?フィールドを設定とViewModelに「ダブルバインド」できますか?この状況に対する賢明で実用的なアプローチは何ですか?

4

1 に答える 1

1

正確な設定に応じて、これに対処する簡単な方法がいくつかあります。

ユーザーが入力するテキストボックスだけがあり、インタラクティブな方法でデータをフィルタリングする場合は、ビュー* の背後にあるコードでTextChangedイベントハンドラーを使用できます。そのイベント ハンドラーから、viewmodel によって公開されたコマンドを呼び出すことができます。そのコマンドは、検索テキストを入力として受け取り、それに応じてデータをフィルター処理できます。もちろん、viewmodel はアプリケーション設定のデータ オブジェクトにもアクセスできますが、私はそれをコマンドのパラメーターとして使用する、より直接的で宣言的なアプローチを好みます。

テキストボックスがあり、ボタンを介して検索/フィルターが開始される場合、ボタンがバインドされているビューモデルからコマンドを公開するだけで、コマンドパラメーターとして要素バインディングを使用してテキストを渡すことができますコマンド。

これらの方法のいずれかを使用すると、ビューモデルの検索/フィルター コードは非常にテストしやすくなります。通常、UI でコードを単体テストしないため、TextChanged ハンドラーのコードについて心配する必要はありません。また、インタラクティブな検索を使用している場合、Reactive Extensionsはビューモデルへの呼び出しを抑制する便利な方法を提供するため、非常に便利です。

*自分自身を絶対的な純粋主義者と見なす一部の人々は、ビュー内のコードを考えると震えますが、それが純粋に UI/表示関連のコードであれば、それを行っても問題ありません。その後、そのインターフェイスを介してビューモデルを呼び出すことができます。

于 2012-05-11T07:23:40.773 に答える