MVVM Foundation:如何从ViewModel关闭应用程序窗口

我正在使用MVVM Foundation,但我认为它非常简单,而且不是特定于框架。 我的设置如下:

  • StartViewModel – 有一个ExitCommand,返回一个RelayCommand / ICommand

    public ICommand ExitCommand { get { return _exitCommand ?? (_exitCommand = new RelayCommand(() => MessageBox.Show("Hello World"))); } } public RelayCommand _exitCommand; 
  • StartView(用户控件)有一个绑定到ExitCommand的按钮

     

首先,尽可能多地阅读MVVM,例如在MSDN上使用Model-View-ViewModel设计模式的WPF应用程序 。 一旦你理解了驱动它的基本原理,答案就会更合理。

基本上,您希望将View(UI)和ViewModel(基本上是抽象UI,还有抽象模型)图层分开并解耦。 显示消息框或关闭窗口应被视为UI特定细节,因此在视图中实现,或者在消息框中实现,通常可通过“服务”获得。

关于ViewModel,这是使用控制反转 (IoC)实现的。 点击上面的消息框示例。 它不是显示消息框本身,而是依赖于具有Show方法的IMessageBoxService,而ViewModel则调用它 – 委派责任。 这可以通过利用dependency injection (DI)容器来进一步采取。

用于关闭View窗口的另一种方法可能是ViewModel公开一个事件,例如View订阅的RequestClose(如MSDN文章中所述)。 然后ViewModel会在想要关闭相应的View /窗口时引发事件; 它假定其他人正在倾听并承担责任并实际执行。

您可以在StartViewModel中实现CloseEvent。 在您的StartView中,您必须注册此CloseEvent。 当您从虚拟机提升关闭事件时,您的视图会识别出它必须关闭您的应用程序/窗口。