私のWPFアプリケーションでは、ViewModelLocator
をIoCなしで使用しています。 MVVM-Lightフレームワークが提供する静的なViewModelLocator.Cleanup()
メソッドを、自分のボタンから「クローズウィンドウコマンド」に結びつけて呼び出しています。このコマンドは、MainWindowViewModelインスタンスでインスタンスCleanup()メソッドを呼び出すstatic ViewModelLocator.Cleanup()
を呼び出します。次に、インスタンスCleanup()メソッドは、MainWindowがバインドするプロパティー(DataContext
)をnullに設定します。プロパティ上のセッターはPropertyChanged
イベントを発生させます。不思議なことに、このプロパティをnullに設定してもウィンドウが閉じることはありません。MVVMを使用しているときにアプリケーションを終了するか、コントロールを閉じる
私はなぜこれが当てはまるのか理解しようとしていますか? MainWindowのDataContext
をnullに設定した場合、それはWindow.Close()
と同じではないでしょうか?私の場合、ウィンドウとそのすべての要素は画面上に残ります。しかし、それ以上のアクションを試みるとnullポインタ例外が発生し、DataContext
バインディングプロパティが実際にnullに設定されていることを示します。これはデバッガでも確認されています。
私は、自分自身の「ウィンドウを閉じる」ボタンを作成するために、Application.Exitイベントをフックし、Window.Close()を発行することで回避策を作成しました(つまり、 /コマンドは、ウィンドウの右上にあるXボタンをクリックします)。 MVVMからUI要素(つまりWindowインスタンス)を直接呼び出すのはMVVMには適していないので、回避MVVMを使いやすいようにWindow.Close()機能を実装するためにViewServiceを使用しました。私はViewServiceイディオム(またはパターン)の大きなファンですが、ここでは必要ではないと思っています。ただし、アプリケーションを終了すると、アプリケーションのライフサイクルと結びつくべき特別なケースであることがわかりました.Netは、Window.Close()メソッドを発行してWPFアプリケーションを終了することしかできないようです。
感謝しています。
私はあなたの質問が何であるか知らないが、nullにそののDataContextを設定することで、ウィンドウを閉じると – flq
@flqかなり直感的で非常に有用ではないに聞こえる:あなたは、ユーザーコントロールのように、他の視覚的要素を「閉じる」ことに同意しますか、定期的に行われていますDataContextをViewModelにバインドするプロパティをnullに設定すると、私はウィンドウを閉じたり、アプリケーションを終了するために同じアプローチを取っていた。 ViewModelからアプリケーションを終了する正しい方法(それによってMVVMに優しい)のように思えました。もちろん、Propをnullに設定することは、適切かもしれないすべてのクリーンアップに従います。私はあなた自身の終了ボタンを実装したい場合、私の質問は、単純に、どのようにmvvmライトアプリを終了すると思いますか? – Bill
ビューを閉じるこの方法は、MVVMのライト固有の動作ですか? – flq