handling window close button in wpf MVVM

后端 未结 2 643
伪装坚强ぢ
伪装坚强ぢ 2020-12-09 03:56

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 cl

相关标签:
2条回答
  • 2020-12-09 04:09

    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

    Xaml:

    <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

    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.

    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;
    }
    
    0 讨论(0)
  • 2020-12-09 04:15

    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.

    0 讨论(0)
提交回复
热议问题