1

在我的应用程序中,我有一个通过 MEFedMVVM 导入 ViewModel 的 MainWindow:

xmlns:mefed="clr-namespace:MEFedMVVM.ViewModelLocator;assembly=MEFedMVVM.WPF"
mefed:ViewModelLocator.ViewModel="MainViewModel"

现在我也有我的 ViewModel 来实现 ViewModel:

[ExportViewModel("MainViewModel")]
public class MainViewModel: ViewModelBase

在我的 ViewModel 中,我有一个用于关闭窗口的 ICommand 属性。关闭事件可以来自任何地方。在 Cinch Framework 2.0 的帮助下,我实现了一个带有 Execute 方法的 Simplecommand。

问题

如何从我的执行方法中关闭窗口?通过依赖注入,我没有构造函数,我无法注册事件或将视图作为参数提供给视图模型。

编辑

但是,我认为不太好的可能性:

在方法中调用它

Application.Current.MainWindow.Close()
4

1 回答 1

1

您可以通过编写一个ICommandWindow实例作为参数传入的方法来实现这一点。

此处提供了一个很好的示例:如何将“按 Escape 键时关闭”行为分配给项目中的所有 WPF 窗口?

在那篇文章中,ICommand最终绑定到 a KeyBinding(以便可以使用 Escape 键关闭窗口),但您可以将命令绑定到任何按钮或从视图中的任何位置调用它。重要的部分是RelativeSource在您的命令参数绑定上使用 a 来引用Window您要关闭的

根据评论进行编辑

该命令是一个单例,但并不要求它是单例——它只是一个单例,因为它是无状态的并且它使绑定更容易。它获取对Windowthrough 绑定的引用,因此UserControl您可以使用:

<Button Command="{x:Static mynamespace:CloseWindowCommand.Instance}"
    CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Content="Close My Parent Window" />

能够从视图模型代码中调用它稍微复杂一些,需要不同的方法;一个很好的例子可以在这里找到:http: //gallery.expression.microsoft.com/WindowCloseBehavior

于 2011-10-19T12:18:42.973 回答