使用MEFedMVVM关闭Window的最佳方法

时间:2011-10-19 12:07:29

标签: wpf c#-4.0 mvvm mef mefedmvvm

在我的应用程序中,我有一个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()

1 个答案:

答案 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