即使e.Cancel = true,WPF覆盖OnClosing仍会清除DataContext

时间:2011-10-17 12:00:06

标签: wpf

没关系......发现它......也明白为什么......

我查看了WPF,并覆盖了WPF窗口的OnClosing以防止在任何条件下关闭窗口......例如在允许窗口关闭之前编辑并获取用户确认。之前做了很多次,但是在C#WinForms下。

在WPF中,我有我的VMMV,并且ViewModel被设置为WPF窗口的“DataContext”,没问题......所有字段都绑定,刷新,根据需要启用/禁用等等。一旦我点击关闭按钮,已被覆盖的“OnClosing”进入我的功能,并要求确认关闭或不...没有什么特别的。如果没问题,请继续。如果不是,我设置e.Cancel = true(中止关闭窗口)。

public void ViewModelClosing(object sender, CancelEventArgs e)
{
   if (MessageBox.Show("Close the current window?", "Close", 
         MessageBoxButton.OKCancel) == MessageBoxResult.Cancel)
      // Nope, do not allow the window to close, so "CANCEL" the close window operation
      e.Cancel = true;
}

但是,当我发送OnClosing函数时,SOON已经完成,Window的“DataContext”也消失了,所有相应的“Bindings”也都消失了。我错过了一些简单的东西吗?

---编辑--- 糟糕,澄清。我没有使用任何特定的框架,而是我自己的具有属性和ICommands的类。上面的函数从Window的OnClosing钩子调用到事件列表中不起作用......

OnClosing += myViewModel.ViewModelClosing;

但奇怪的是,如果我直接将窗口覆盖(它不会破坏绑定)

protected override void OnClosing(CancelEventArgs e)
{
  if( MessageBox.Show( "Ok to close", "Closing", MessageBoxButton.YesNo ) 
        == MessageBoxResult.No )
    e.Cancel = true;
}

1 个答案:

答案 0 :(得分:2)

我同意hyp。 WPF中的任何内容都不会自动清除DataContext。您可能正在使用一些MVVM Framework来帮助您防止内存泄漏,但显然是过于热心。