处理 wpf MVVM 中的窗口关闭按钮

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15201122/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 07:50:51  来源:igfitidea点击:

handling window close button in wpf MVVM

wpfmvvm

提问by Andris Mudiayi

is there a way to handle the window close button ie "X" in the top right corner in the viewmodel by binding to a command? or overriding the window.close command so that closing one window goes back to the previous window. Thanx.

有没有办法通过绑定到命令来处理视图模型右上角的窗口关闭按钮,即“X”?或覆盖 window.close 命令,以便关闭一个窗口回到上一个窗口。谢谢。

回答by Haritha

There are several methods for this. I have pointed out two methods below.

有几种方法可以做到这一点。我在下面指出了两种方法。

  1. You can use attached commands to bind the close button in your view model.

  2. You can use Below code

  1. 您可以使用附加命令绑定视图模型中的关闭按钮。

  2. 您可以使用下面的代码

Xaml:

Xml:

<Window x:Class="WpfInfragisticsModal.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" 
        xmlns:ig="http://schemas.infragistics.com/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        Name="myWindow">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Closing">
            <i:InvokeCommandAction Command="{Binding CloseWindowCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid>
    </Grid>
</Window>

NOTE: Add System.Windows.Interactivity reference

注意:添加 System.Windows.Interactivity 参考

View Model

查看模型

private ICommand closeWindowCommand;

public ICommand CloseWindowCommand
{
      get
      {
          if (closeWindowCommand == null)
          {
             closeWindowCommand = new RelayCommand(param => this.CloseWindow(), null);
          }
          return closeWindowCommand;
      }
 }

private void CloseWindow()
{
     //Do your operations
}

This is my RelayCommand class.

这是我的 RelayCommand 类。

public class RelayCommand : ICommand
{
    /// <summary>
    /// Initializes a new instance of the <see cref="RelayCommand"/> class.
    /// </summary>
    /// <param name="execute">The execute.</param>
    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="RelayCommand"/> class.
    /// </summary>
    /// <param name="execute">The execute.</param>
    /// <param name="canExecute">The can execute.</param>
    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");
        _execute = execute;
        _canExecute = canExecute;
    }

    /// <summary>
    /// Defines the method that determines whether the command can execute in its current state.
    /// </summary>
    /// <param name="parameter">Data used by the command.  If the command does not require data to be passed, this object can be set to null.</param>
    /// <returns>
    /// true if this command can be executed; otherwise, false.
    /// </returns>
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

    /// <summary>
    /// Occurs when changes occur that affect whether or not the command should execute.
    /// </summary>
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    /// <summary>
    /// Defines the method to be called when the command is invoked.
    /// </summary>
    /// <param name="parameter">Data used by the command.  If the command does not require data to be passed, this object can be set to null.</param>
    public void Execute(object parameter)
    {
        _execute(parameter);
    }

    /// <summary>
    /// Action
    /// </summary>
    private readonly Action<object> _execute;


    /// <summary>
    /// Predicate
    /// </summary>
    private readonly Predicate<object> _canExecute;
}

回答by Andris Mudiayi

the problem was that i was closing a parent window and reopening it after closing its respective child window, causing memory leaks. I resolved by hiding the parent window and then showing it again after child window closes. I am new to wpf and windows development so i learn as i go.

问题是我正在关闭父窗口并在关闭其各自的子窗口后重新打开它,导致内存泄漏。我通过隐藏父窗口然后在子窗口关闭后再次显示它来解决。我是 wpf 和 windows 开发的新手,所以我边走边学。