2012-11-29 23 views
3

我有一个WPF应用程序,它允许我编辑一些数据。取消视图模型中的窗户关闭?

我想说,如果我们试图关闭应用程序,用户必须承认他将失去其修改。

但是我们在这里,我有几个问题:

  1. 没有“关闭”命令在Windows对象(当我从代码的事件背后,我想我可以执行的命令)
  2. 我不知道如何推荐使用MVVM模式取消某些内容的方法?通常我会已经把e.Cancel = true;,但我们不能因为它是一个命令

所以,你会如何询问用户是否他是一定要关好窗户,与MVVM模式?

+0

这里有一点要注意的是,仅仅因为你使用的MVVM模式,这并不意味着你_can't_使用的事件 - 只是,你应该通常尽量避免使用命令更有意义。通常,我创建自己的类来扩展实用程序DLL中的每个组件(窗口,文本框等),并使用它们。这样,如果我需要一个事件来解决这样的事情,那么我不必每次重新发明轮子。 – sybkar

回答

0

这个概念是为您的窗口添加一个行为,该行为“挂钩”到窗口关闭事件中。一旦行为被吸引,您可以在不违反MVVM原则的情况下执行任何您需要的操作。检查如何创建一个窗口关闭行为此链接的信息:

http://gallery.expression.microsoft.com/WindowCloseBehavior/

希望有所帮助。

+0

谢谢你的这篇文章,这对我来说非常有启发性。我有一个问题,就我而言,我必须问用户他是否真的想关闭窗户。如果我按照你的例子,我应该在CanExecute中的MessageBox查询。问题是这个CanExecute的执行将启动一些MessageBox,并且框架可能会尝试频繁执行“CanExecute”,并向我的用户显示大量的弹出窗口。我已经下载了你的链接的例子,我修改了一下,询问用户是否要关闭,并添加一个带有这个关闭命令的按钮http://u.j4n.ch/TrXFbs – J4N

+0

继代码字面上的示例会要求您将消息框查询放入CanExecute方法中,但正如您所看到的那样,这不是最佳选择。我会偏离这种情况下的例子,并根据您的消息框处理您的取消变量是一个结果。例如,在Window_Closing事件中,如果用户接受close,则显示消息框,然后执行close命令。如果用户选择取消关闭,则将e.Cancel事件属性设置为true并让代码退出。 – Backlash

+0

是的,我知道我可以做到这一点,但是选择演示文稿是为了在ViewModel上做的事情,而不是在后面的代码中完成,而且此项目的主要目标是完全应用MVVM概念 – J4N

0

由于您将此问题标记为“mvvm-light”,因此您可以检查MVVMLight中的EventToCommand。它可能会满足你的需求。

这个问题是相似的:

Handling the window closing event with WPF/MVVM Light Toolkit

+0

是的,我使用MVVM光,但问题是,一旦事件转换成命令,我没有任何参数,我可以做一个e.Cancel = true; – J4N

+1

@ J4N:您是否在EventToCommand中设置了PassEventArgsToCommand =“True”? – Johnsonlu