我正在使用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