我正在使用MVVM設計原則構建一個wpf應用程序。我的ViewModel有一個觸發RequestClose
事件的CloseCommand
。如果將ViewModel設置爲窗口的datacontext,則窗口將訂閱此事件,並在事件觸發時自行呼叫Close()
。通過我自己的命令發送窗口的「關閉」命令?
我的問題是,用戶可以不通過我的RequestClose
系統而導致窗口關閉 - 例如,通過單擊窗口右上角的「x」。我想覆蓋這個,所以點擊'x'發送一個請求到我的CloseCommand
。
我試圖這種方法附連到「截止」事件我的窗口:
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
?
如何設置一個布爾'IsClosing 「你的虛擬機中的某個地方,只是自己跟蹤它?這會起作用嗎? – Default 2012-04-25 10:51:51
@Default我沒有想到 - 我可能會用它。儘管它有一點點黑客,但我寧願有其他的東西。 – Oliver 2012-04-25 11:02:59
我明白..我發現還有一個「OnClosing」事件。你可能想從那裏觸發bool。 – Default 2012-04-25 11:03:50