8

MVVM Light Toolkit を利用する MVVM デザイン パターンを使用して WPF アプリケーションを開発しています。現在、私はこのようなシナリオを持っています。

ここに画像の説明を入力

アイテム コントロールを組織コレクションにバインドしています。

  1. 組織名とリストで構成される組織。
  2. プロジェクト名、リスト、新入社員で構成されるプロジェクト
  3. 従業員名、連絡先番号、電子メールで構成される従業員

ここに画像の説明を入力

ここで、従業員自体は、既存および新規の従業員データで再利用されるユーザー コントロールです。

ユーザーは、すべてのコントロールの Lost Focus イベントで、既存の従業員の詳細 (つまり、リスト) を更新できます。新しい従業員の追加に関しては、ユーザー コントロールのLost Focus Event を使用して状況を処理しました。そのため、MVVM Light Toolkit EventToCommandを使用してユーザー コントロールがフォーカスを失ったイベントでは、EventArgs を View Model に渡し、EventArgs から元のソースを見つけて(またはビジュアル ツリーをトラバースして)、それが挿入されるかどうかを確認して、挿入されるかどうかを識別します。フォーカスは、IsKeyBoardFocusWithin プロパティを使用して同じユーザー コントロール内にあります。

これはMVVMパターンの正しい実装ですか?

また、上記のアプローチを行うことで、次のことを行う必要があります。

  1. ビジュアル ツリーをトラバースするか、EventArgs から元のソースを取得するには、System.Windows.Controls を参照する必要があります。

  2. 単体テストに関しては、EventArgs をモックするのはより困難です。

このシナリオを処理するためのより良い MVVM アプローチはありますか?</p>

4

1 に答える 1

3

あなたが言及したように、ViewModel ではビジュアル ツリーをトラバースすることは避ける必要があります。

したがって、このアプローチの代わりに、ビヘイビアを使用することができます- チュートリアル

  • という名前の動作を作成すると仮定しましょうAddNewEmployeeBehavior
  • RelayCommand<Employee> AddNewEmployeeCommand;次に、VM に を追加します。
  • RelayCommand<Employee>タイプのDP を作成しますAddNewEmployeeBehavior
  • ビューで、動作の DP をにバインドしますAddNewEmployeeCommand
  • 次にAddNewEmployeeBehavior、VM で行っていたことを実行して、新しいアイテムをに追加する必要があるかどうかを確認しますList<Employee>
  • VM/モデルに保持されているリストに新しいアイテムを追加する必要がある場合は、Employeeオブジェクトにラップされた新しい従業員の詳細を渡す動作で DP コマンドを呼び出します。
  • VM で、それに応じて RelayCommand を作成し、invoked-with 引数をList<Employee>

このアプローチでは、ビューに何もありませんEventToCommand。コマンドを DP として受け取るビヘイビアを用意し、ビューのみの条件に基づいて、必要に応じてコマンドを呼び出すようにします。

単体テストに関しては、単体テストで必要なときに呼び出すことができる RelayCommand しかないので、これは非常に簡単です。

これは、VM にビュー関連のロジックがなくなり、ビヘイビアーがビューに対してそれを処理するため、MVVM ソリューションとして保持されます。

VM -> ViewModel

DP ->依存関係プロパティ

于 2013-05-08T14:46:07.097 に答える