【问题标题】:Cancel a windows close from a View Model?从视图模型中取消关闭窗口?
【发布时间】:2012-11-17 12:24:20
【问题描述】:

我有一个 WPF 应用程序,它允许我编辑一些数据。

我希望如果我们尝试关闭应用程序,用户必须承认他将丢失其修改。

但是到了这里,我遇到了几个问题:

  1. windows 对象上没有“关闭”命令(当我猜想后面的代码有事件时,我可以执行命令)
  2. 我不知道用 MVVM 模式取消某些东西的推荐方法是什么?通常我会输入e.Cancel = true;,但我们不能,因为它是一个命令

那么你会如何询问用户是否确定关闭窗口,使用 MVVM 模式?

【问题讨论】:

  • 这里要注意的一点是,仅仅因为您使用的是 MVVM 模式,并不意味着您不能使用事件——只是您通常应该尝试在使用命令更有意义的地方避免它。通常,我创建自己的类来扩展实用程序 DLL 中的每个组件(窗口、文本框等),并使用它们。这样,如果我需要一个事件来触发这样的事情,我就不必每次都重新发明轮子。

标签: wpf events mvvm viewmodel mvvm-light


【解决方案1】:

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

这个问题类似:

Handling the window closing event with WPF / MVVM Light Toolkit

【讨论】:

  • 是的,我正在使用 MVVM LIght,但问题是一旦将事件转换为命令,我就没有任何可以执行 e.Cancel=true 的参数了;
  • @J4N:你在 EventToCommand 中设置了 PassEventArgsToCommand="True" 吗?
【解决方案2】:

这个概念是为您的窗口添加一个“挂钩”到窗口关闭事件的行为。一旦行为被挂钩,您可以执行几乎任何您需要的操作,而不会违反 MVVM 的原则。查看此链接以获取有关如何创建窗口关闭行为的信息:

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

希望对您有所帮助。

【讨论】:

  • 感谢您的这篇文章,它对我很有启发。我有一个问题,就我而言,我必须问用户他是否真的想关闭窗户。如果我按照你的例子,我应该在 CanExecute 中使用 MessageBox 查询。问题是这个 CanExecute 的执行会启动一些 MessageBox,框架可能会尝试频繁地执行“CanExecute”,向我的用户显示很多弹出窗口。我已经下载了您的链接示例,我对其进行了一些修改,询问用户是否要关闭,并添加一个带有此关闭命令的按钮u.j4n.ch/TrXFbs
  • 按照代码示例的字面意思会要求您将消息框查询放在 CanExecute 方法中,但正如您所见,这不是最佳的。在这种情况下,我会偏离示例,并将您的取消变量处理为基于您的消息框的结果。例如,在 Window_Closing 事件中,显示您的消息框,如果用户接受关闭,则执行您的关闭命令。如果用户选择取消关闭,则将 e.Cancel 事件属性设置为 true 并让代码退出。
  • 是的,我知道我可以做到,但是选择展示是为了在 ViewModel 上做一些事情,而不是在后面的代码中,这个项目的主要目标是充分应用 MVVM概念
  • 行为不是代码隐藏。行为是将功能封装到可重用组件中的一种方式。我看不到行为的实现如何打破 MVVM 概念?也许我没有遵循您所说的“做出演示选择是为了在 ViewModel 上做某事”的意思?您指的是哪种演示选择?
  • 你说我应该在 Window_Closing 中做一些事情(所以在后面的代码中)。我说的是这个方法中的所有内容。
猜你喜欢
  • 2018-06-12
  • 2013-10-09
  • 1970-01-01
  • 2018-04-26
  • 2012-06-18
  • 2015-05-13
  • 1970-01-01
  • 2023-03-30
  • 2012-04-22
相关资源
最近更新 更多