在我的应用程序中,我有一个MainWindow,它通过MEFedMVVM导入ViewModel:
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。
问题
如何从执行方法中关闭窗口?在依赖注入上我没有构造函数,我无法注册事件或将视图作为参数提供给viewmodel。
修改
然而,我认为这种可能性并不好:
在方法中调用
Application.Current.MainWindow.Close()
答案 0 :(得分:1)
您可以通过编写将ICommand
实例作为参数传递的Window
来实现此目的。
这里有一个很好的例子:How can I assign the 'Close on Escape-key press' behavior to all WPF windows within a project?
在该帖子中,ICommand
最终绑定到KeyBinding
(以便可以使用Escape键关闭窗口),但是您可以将命令绑定到任何按钮或调用它来自视图中的任何位置。重要的是在命令参数绑定上使用RelativeSource
来引用要关闭的Window
编辑以回应评论
该命令是一个单例,但不需要它 - 它只是一个单例,因为它是无状态的,它使绑定更容易。它通过绑定获取对Window
的引用,因此对于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