如何在MVVM WPF应用程序中取消关闭窗口

安德里·穆齐丘克(Andrii Muzychuk)

单击取消按钮(或右上角的X或Esc)后,如何取消退出特定表单?

WPF:

<Window
  ...
  x:Class="MyApp.MyView"
  ...
/>
  <Button Content="Cancel" Command="{Binding CancelCommand}" IsCancel="True"/>
</Window>

ViewModel:

public class MyViewModel : Screen {
  private CancelCommand cancelCommand;
  public CancelCommand CancelCommand {
    get { return cancelCommand; }
  }
  public MyViewModel() {
    cancelCommand = new CancelCommand(this);
  }
}

public class CancelCommand : ICommand {

  public CancelCommand(MyViewModel viewModel) {
    this.viewModel = viewModel;
  }

  public override void Execute(object parameter) {
    if (true) { // here is a real condition
      MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show(
        "Really close?",  "Warning", 
        System.Windows.MessageBoxButton.YesNo);
      if (messageBoxResult == MessageBoxResult.No) { return; }
    }
    viewModel.TryClose(false);
  }

  public override bool CanExecute(object parameter) {
    return true;
  }
}

当前代码无效。如果希望在弹出对话框中选择“否”,我希望用户保留当前表单。同样,重写CanExecute也无济于事。它只是禁用按钮。我想允许用户点击按钮,但随后通知他/她,该数据将丢失。也许我应该在按钮上分配一个事件监听器?

编辑:

我设法在“取消”按钮上显示弹出窗口。但是我仍然无法管理Esc或X按钮(右上角)。似乎我对取消按钮感到困惑,因为单击X按钮或Esc时将执行Execute方法。

编辑2:

我改变了问题。这是“如何取消取消按钮”。但是,这不是我想要的。我需要取消Esc或X按钮。在“ MyViewModel”中,我添加:

        protected override void OnViewAttached(object view, object context) {
            base.OnViewAttached(view, context);
            (view as MyView).Closing += MyViewModel_Closing;
        }

        void MyViewModel_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
            if (true) {
                MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show(
                  "Really close?",  "Warning", 
                  System.Windows.MessageBoxButton.YesNo);
                if (messageBoxResult == MessageBoxResult.No) {
                    e.Cancel = true;
                }
            }
        }

这解决了我的问题。但是,我需要ICommand来了解单击了哪个按钮,然后单击“保存”或“取消”。有什么方法可以消除事件的使用?

优素福·塔瑞克(YusufTarık)早上好

您正在尝试在ViewModel类中执行View的工作。让您的View类处理关闭请求以及是否应取消它。

要取消关闭窗口,您可以订阅Closingview事件,并CancelEventArgs.Cancel在显示之后将其设置为true MessageBox

这是一个例子:

<Window
    ...
    x:Class="MyApp.MyView"
    Closing="OnClosing"
    ...
/>
</Window>

后面的代码:

private void OnClosing(object sender, CancelEventArgs e)
{
    var result = MessageBox.Show("Really close?",  "Warning", MessageBoxButton.YesNo);
    if (result != MessageBoxResult.Yes)
    {
        e.Cancel = true;
    }

    // OR, if triggering dialog via view-model:

    bool shouldClose = ((MyViewModel) DataContext).TryClose();
    if(!shouldClose)
    {
        e.Cancel = true;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在WPF MVVM应用程序中启动选中的单选按钮= true

来自分类Dev

如何在WPF MVVM应用程序中创建报表而不引用数据库

来自分类Dev

如何在mvvm / wpf中的应用程序启动时启动bg线程?

来自分类Dev

如何在React + Redux应用程序中关闭在外部单击的模式窗口?

来自分类Dev

如何在c#WPF应用程序中取消上传

来自分类Dev

关闭子窗口时,如何清除存储在父应用程序中的子窗口引用?

来自分类Dev

如何防止关闭窗口时关闭应用程序?

来自分类Dev

如何在相同的Pragrom /应用程序中重新打开WPF窗口?

来自分类Dev

如何在两个窗口之间的Wpf应用程序中维护会话?

来自分类Dev

如何在WPF应用程序中设置所有窗口的背景图像

来自分类Dev

如何在WPF多窗口应用程序中动态加载和保存用户设置?

来自分类Dev

如何在 C# WPF 应用程序中调整 Auth0 登录窗口的大小?

来自分类Dev

macCatalyst应用程序:如何在不终止应用程序的情况下关闭窗口?

来自分类Dev

如何在ViewModel(MVVM Model)WPF应用程序中使用命令行参数

来自分类Dev

如何从其他应用程序关闭Chrome窗口?

来自分类Dev

如何从通知中关闭应用程序

来自分类Dev

如何在Phonegap应用程序中关闭InAppBrowser本身?

来自分类Dev

如何在Silverlight中关闭应用程序

来自分类Dev

如何在OS X中关闭盖上的应用程序

来自分类Dev

如何在独立应用程序中关闭Ehcache CacheManager

来自分类Dev

如何在OSX应用程序中还原窗口位置?

来自分类Dev

如何使用java处理关闭outlook邮件窗口(桌面应用程序)窗口并切换回selenium中的Web应用程序

来自分类Dev

如何等待单击然后关闭WPF应用程序中的启动画面?

来自分类Dev

当 WPF 应用程序中的文本框输入更改时,如何更改主窗口颜色?

来自分类Dev

如何概括代码以在 WPF 应用程序中每个窗口只允许一个实例

来自分类Dev

如何在应用程序窗口中保持弹出窗口WPF

来自分类Dev

如何通过应用程序关闭应用程序的窗口,并传递文件名?

来自分类Dev

单击“ X”按钮时如何关闭WPF应用程序

来自分类Dev

如何在Delphi-XE5 Firemonkey应用程序中关闭android应用程序?

Related 相关文章

  1. 1

    如何在WPF MVVM应用程序中启动选中的单选按钮= true

  2. 2

    如何在WPF MVVM应用程序中创建报表而不引用数据库

  3. 3

    如何在mvvm / wpf中的应用程序启动时启动bg线程?

  4. 4

    如何在React + Redux应用程序中关闭在外部单击的模式窗口?

  5. 5

    如何在c#WPF应用程序中取消上传

  6. 6

    关闭子窗口时,如何清除存储在父应用程序中的子窗口引用?

  7. 7

    如何防止关闭窗口时关闭应用程序?

  8. 8

    如何在相同的Pragrom /应用程序中重新打开WPF窗口?

  9. 9

    如何在两个窗口之间的Wpf应用程序中维护会话?

  10. 10

    如何在WPF应用程序中设置所有窗口的背景图像

  11. 11

    如何在WPF多窗口应用程序中动态加载和保存用户设置?

  12. 12

    如何在 C# WPF 应用程序中调整 Auth0 登录窗口的大小?

  13. 13

    macCatalyst应用程序:如何在不终止应用程序的情况下关闭窗口?

  14. 14

    如何在ViewModel(MVVM Model)WPF应用程序中使用命令行参数

  15. 15

    如何从其他应用程序关闭Chrome窗口?

  16. 16

    如何从通知中关闭应用程序

  17. 17

    如何在Phonegap应用程序中关闭InAppBrowser本身?

  18. 18

    如何在Silverlight中关闭应用程序

  19. 19

    如何在OS X中关闭盖上的应用程序

  20. 20

    如何在独立应用程序中关闭Ehcache CacheManager

  21. 21

    如何在OSX应用程序中还原窗口位置?

  22. 22

    如何使用java处理关闭outlook邮件窗口(桌面应用程序)窗口并切换回selenium中的Web应用程序

  23. 23

    如何等待单击然后关闭WPF应用程序中的启动画面?

  24. 24

    当 WPF 应用程序中的文本框输入更改时,如何更改主窗口颜色?

  25. 25

    如何概括代码以在 WPF 应用程序中每个窗口只允许一个实例

  26. 26

    如何在应用程序窗口中保持弹出窗口WPF

  27. 27

    如何通过应用程序关闭应用程序的窗口,并传递文件名?

  28. 28

    单击“ X”按钮时如何关闭WPF应用程序

  29. 29

    如何在Delphi-XE5 Firemonkey应用程序中关闭android应用程序?

热门标签

归档