WPFとMVVMの問題を学習しようとしていますが、問題が発生しました。この質問は似ていますが、これとまったく同じではありません(handling-dialogs-in-wpf-with-mvvm) ...
MVVMパターンを使用して書かれた「ログイン」フォームがあります。
このフォームには、通常のデータバインディングを使用してXAMLのビューにバインドされているユーザー名とパスワードを保持するViewModelがあります。また、通常のデータバインディングを使用して、フォームの[ログイン]ボタンにバインドされている[ログイン]コマンドもあります。
「Login」コマンドが起動すると、ViewModelの関数が呼び出され、ネットワークを介してデータが送信されてログインします。この関数が完了すると、2つのアクションがあります。
ログインが無効でした-メッセージボックスを表示するだけで問題ありません
ログインは有効でした。ログインフォームを閉じ、trueを返す必要があり
DialogResult
ます...
問題は、ViewModelが実際のビューについて何も知らないため、ビューを閉じて特定のDialogResultを返すように指示するにはどうすればよいですか?CodeBehindにコードを貼り付けたり、ViewをViewModelに渡したりすることはできますが、MVVMのポイント全体を完全に無効にするようです...
更新
結局、MVVMパターンの「純粋さ」に違反し、ビューにClosed
イベントを発行させ、Close
メソッドを公開させました。その後、ViewModelは単にを呼び出しますview.Close
。ビューは、インターフェースを介してのみ認識され、IOCコンテナーを介して配線されるため、テスト性や保守性が失われることはありません。
受け入れられた回答が-5票であるのはかなりばかげているようです!「純粋」でありながら問題を解決することで得られる良い気持ちはよく知っていますが、1行のメソッドを回避するためだけに200行のイベント、コマンド、および動作を考えているのは、私だけではありません。 「パターン」と「純度」の名前は少しばかげています...
Close
方法が最善の解決策であると私は思います。他のより複雑なダイアログの他のすべてはMVVMとデータバインドですが、単純な方法ではなく、ここで巨大な「ソリューション」を実装するのはばかげているように見えました...