3

WPF コマンドの使用方法と、それらが MVVM パターンにどのように適合するかを学習しようとしています。ボタンやメニューなどの一部のコントロールには Command プロパティがあり、ICommand クラスのインスタンスに設定するとボタンがそのコマンドに接続されることを理解しています。これが設定されると、ボタンはコマンドの CanExecuteChanged イベントで無効化および有効化され、コントロールをクリックするとコマンドの Execute メソッドが呼び出されます。

しかし、各 ICommand のインスタンスはどこに置くべきでしょうか? チュートリアルでさまざまなオプションを見てきましたが、どれが正しいのかわかりません。一部の例では、静的な「ApplicationCommands」クラスが作成され、各コマンドのインスタンスがそのクラスの静的プロパティに割り当てられます。他の例では、コマンドが ViewModel のプロパティとして設定されているのを見てきました。他の例では、View/Window 自体のプロパティとして設定されています。コマンド インスタンスを配置するのに適した場所は?

また、コマンドはビュー、ビュー モデル、またはモデルにどのように関連していますか? これらのコンポーネントのうち、コマンドが認識または操作する必要があるのはどれですか? コマンドが実行されるとどうなりますか? ビューモデル/ビューに変更を伝えるモデルのメソッドを呼び出す必要がありますか? または、コマンドはビュー モデルのメソッドを介してモデルと通信する必要がありますか?

4

2 に答える 2

1

一部の例では、静的な「ApplicationCommands」クラスが作成され、各コマンドのインスタンスがそのクラスの静的プロパティに割り当てられます

これは、どこからでもアクセスできるようにするコマンドに対して行います。たとえば、 のキーバインドでF1常にヘルプ画面を表示したい場合は、このコマンドをグローバルにアクセス可能な 1 つの場所に実装し、さまざまな画面からバインドします。

ViewModel のプロパティとして設定されたコマンドと、View/Window 自体の他のプロパティに設定されたコマンド。

コマンドがデータに対して何らかの処理を行う場合、ViewModel は適切な場所です。コマンドがデータに対して何もする必要がない場合は、View のコード ビハインドに配置します (ViewModel とは関係なく、ViewModel を汚染する必要がないため)。興味深いケースは、キーストロークに応答してダイアログをポップアップするようなことをしていて、現在選択されているグリッド項目をダイアログに渡す必要がある場合です。コマンドはどこに行くべきでしょうか? この場合、ViewModel に配置する説得力のある理由がないため、ビューのコード ビハインドに配置します。必要に応じて、選択した項目を View によって ViewModel から取得できます。

人々がそれを行う唯一の方法だと考えたという理由だけで、不必要に ViewModel にコマンドを挿入するのを何度も見てきました。私が使用する経験則は次のとおりです。UI 関連の作業を行っている場合は、ビューの背後にあるコードに属します。データ関連の作業を行っている場合は、ViewModel に入れることができます。混在している場合は、View と ViewModel の両方で機能を分割することを検討してください。

これらのコンポーネントのうち、コマンドが認識または操作する必要があるのはどれですか?

それが知る必要があるものだけ。ViewModel からモデルなどのコンポーネントへのアクセスは、適切に定義されたプロパティまたはインターフェイスを返す関数を介して行う必要があります。これは密結合を避けるためです。

ビューモデル/ビューに変更を伝えるモデルのメソッドを呼び出す必要がありますか?

ViewModel から Model にアクセスするコマンドに問題はありません。このコマンドは ViewModel または Model のプロパティを更新でき、データ バインディングとプロパティ通知のマジックを介して、これらの更新を UI に反映させることができます。

于 2012-03-01T00:20:56.367 に答える
1

静的コマンドを使用したアプローチは、通常RoutedCommands、特定のオブジェクトの状態に結合されていない幅広い用途を持つコマンドまたはコマンドで使用されます。コンストラクターで渡されたメソッドを取得する動的実装を使用する場合ICommand、それらは通常、ViewModelそのコマンドが関連する のインスタンスです。

これらのコマンドは ViewModel と Model で動作します。これを行う方法はあなた次第ですExecute。コマンドの初期化コードを簡潔に保つために、コマンドから VM でそれぞれのメソッドを呼び出すことがよくあります。

最善のアプローチが何であるかを実際にお伝えすることはできません。他の誰かが、何がいつ、なぜ最も効果的かについてより多くの洞察を持っているかもしれません。

于 2012-03-01T00:10:38.717 に答える