私の WPF アプリケーションでは、ViewModelLocator
IoC なしで を使用しています。ViewModelLocator.Cleanup()
「ウィンドウを閉じるコマンド」に関連付けられている独自のボタンから、MVVM-Light フレームワークによって提供される静的メソッドを呼び出しています。ViewModelLocator.Cleanup()
この Command は、 MainWindowViewModel インスタンスのインスタンス Cleanup() メソッドを呼び出すstaticを呼び出します。次に、インスタンスの Cleanup() メソッドは、MainWindow がそのDataContext
をバインドするプロパティを null に設定します。プロパティのセッターがPropertyChanged
イベントを発生させます。不思議なことに、このプロパティを null に設定しても、ウィンドウは閉じません。
なぜそうなのか理解しようとしていますか?MainWindowDataContext
を null に設定した場合、それは と同じではないWindow.Close()
でしょうか? 私の場合、ウィンドウとそのすべての要素が画面に残ります。ただし、さらにアクションを試みると、DataContext
バインディング プロパティが実際に null に設定されていることを示す null ポインター例外が発生します。これはデバッガーでも確認されています。
Application.Exit イベントをフックし、イベント ハンドラーで Window.Close() を発行して回避策を作成し、独自の「ウィンドウを閉じる」ボタンを作成しました (つまり、独自のボタン/コマンドをクリックするのと同じ機能を作成しました)。ウィンドウの右上にある X ボタン)。MVVM から UI 要素 (つまり、Window インスタンス) を直接呼び出すのは MVVM に適していないため、回避策を MVVM に適したものにするために、ViewService を使用してWindow.Close() 機能を実装しました。私は ViewService のイディオム (またはパターン) の大ファンですが、ここでは必要ないと思います。ただし、アプリの終了はおそらくアプリケーションのライフサイクルと結びつく特別なケースであり、.Net では Window.Close() メソッドを発行することによってのみ WPF アプリを終了できるようです。
考えていただければ幸いです。