MVVM 設計原則を使用して wpf アプリケーションを構築しています。私のViewModelには、イベントCloseCommand
をトリガーする があります。RequestClose
ViewModel がウィンドウのデータ コンテキストとして設定されている場合、ウィンドウはこのイベントをサブスクライブしClose()
、イベントがトリガーされたときにそれ自体を呼び出します。
私の問題は、ユーザーがRequestClose
システムを経由せずにウィンドウを閉じることができることです。たとえば、ウィンドウの右上にある「x」をクリックすることによってです。これをオーバーライドして、「x」をクリックするとリクエストが my に送信されるようにしますCloseCommand
。
このメソッドをウィンドウの「Closing」イベントにアタッチしてみました:
void CloseWindow(object sender, CancelEventArgs e)
{
var chwn = sender as ChildWindow;
var dc = chwn.DataContext as AbstractWorkspaceViewModel;
if (openWindows.Any((wn => dc == wn.DataContext))) {
if (dc.CloseCommand.CanExecute(null)) {
dc.CloseCommand.Execute(null);
e.Cancel = true;
}
}
}
ただし、 からのチェーンCloseCommand
( を通過した後RequestClose
) は を呼び出して終了しwindow.Close()
、次のエラーが発生します。
"Cannot set Visibility to Visible or call Show, ShowDialog,
Close, or WindowInteropHelper.EnsureHandle while a Window is closing."
これは、 と書いたにもかかわらずe.Cancel = true
、ウィンドウはまだ少し後まで閉じると考えているためだと思います。
メソッドを次のように変更することを考えました。
if (dc.CloseCommand.CanExecute(null))
dc.CloseCommand.Execute(null);
else
e.Cancel = true;
ウィンドウがまだ閉じていない場合にのみ呼び出しwindow.close()
ますが、ウィンドウがすでに閉じているかどうかを確認する方法がわかりません。
どうすればこれを解決できますか? ウィンドウの「x」を私のにバインドすることは可能CloseCommand
ですか?