【问题标题】:MVVM Foundation: How to close Application Window from ViewModelMVVM Foundation:如何从 ViewModel 关闭应用程序窗口
【发布时间】:2010-09-25 21:21:39
【问题描述】:

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

  • StartViewModel - 有一个返回 RelayCommand/ICommand 的 ExitCommand

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

    <Button Content="Exit" Command="{Binding ExitCommand}" />  
    

【问题讨论】:

    标签: c# mvvm mvvm-foundation


    【解决方案1】:

    首先,尽可能多地阅读 MVVM,例如WPF Apps With The Model-View-ViewModel Design Pattern 在 MSDN 上。一旦你理解了驱动它的基本原理,答案就会看起来更合理。

    基本上,您希望保持 View (UI) 和 ViewModel(本质上是抽象 UI,但也是抽象模型)层 separate 并解耦。显示消息框或关闭窗口应被视为特定于 UI 的细节,因此在视图中实现,或者在消息框的情况下,更普遍地通过“服务”提供。

    对于 ViewModel,这是使用 Inversion of Control (IoC) 实现的。以上面的消息框为例。它不是显示消息框本身,而是依赖于具有 Show 方法的 IMessageBoxService 并且 ViewModel 调用它来代替 - 委派责任。这可以通过利用 Dependency Injection (DI) 容器来进一步实现。

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

    【讨论】:

    • 嗨,我阅读了这篇文章并尝试实现它。 CloseCommand = new RelayCommand(() =&gt; RequestClose(null, EventArgs.Empty)) 当我点击绑定到CloseCommand 的按钮时,我崩溃了。有什么问题吗?
    • 您能向我们展示您在星空中的代码吗?您在哪里注册参加活动?
    【解决方案2】:

    您可以在 StartViewModel 中实现 CloseEvent。在您的 StartView 中,您必须注册此 CloseEvent。然后,当您从 VM 引发 closeevent 时,您的视图会认识到它必须关闭您的应用程序/窗口。

    【讨论】:

      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      • 2017-09-03
      • 2022-12-05
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多