Confirmation when closing the window with "X" button with MVVM highlight

I am using WPF and MVVM Light framework (I am new to using them).

I want to do the following:

  • When the user clicks the "X" close button, I want to display a confirmation box if he wants to exit the application or not.
  • If yes, the application closes
  • If not, nothing happens and he can still use the application as normal

So far I have this:

  • In MainWindow.xaml.cs:

    public MainWindow()
    {
        InitializeComponent();
        Closing += (s, e) => ViewModelLocator.Cleanup();
    }
    
          

  • In ViewModelLocator.cs:

    public static void Cleanup()
    {
        ServiceLocator.Current.GetInstance<MainViewModel>().Cleanup();
    }
    
          

  • In MainViewModel.cs:

    public override void Cleanup()
    {
        MessageBoxResult result = MessageBox.Show(
                        "Unsaved data will be lost, would you like to exit?",
                        "Confirmation",
                        MessageBoxButton.YesNo,
                        MessageBoxImage.Question);
    
        if (result == MessageBoxResult.Yes)
        {
          // clean-up resources and exit
        }
        else
        {
          // ????
        }
    
          

Actually, if the user answers "Yes" or "No", in both cases the application will exit.

I'm not too sure how to proceed from here ...

Any help would be great!

thank

+2


source to share


2 answers


You can use EventToCommand

in EventTrigger

to catch the closing event and set the Cancel

passed property to CancelEventArgs

true if you want to cancel the closing:

XAML:

<Window ...
   xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
   xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF45"
   DataContext="{Binding Main, Source={StaticResource Locator}}">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="Closing">
         <cmd:EventToCommand Command="{Binding OnClosingCommand}" 
            PassEventArgsToCommand="True"/>
      </i:EventTrigger>
   </i:Interaction.Triggers>
   <Grid>
     ...
   </Grid>
</Window>

      



ViewModel:

public class MainViewModel : ViewModelBase
{
   public RelayCommand<CancelEventArgs> OnClosingCommand { get; set; }

   public MainViewModel()
   {
      this.OnClosingCommand = 
         new RelayCommand<CancelEventArgs>(this.OnClosingCommandExecuted);
   }

   private void OnClosingCommandExecuted(CancelEventArgs cancelEventArgs)
   {
      ...

      if (mustCancelClosing)
      {
         cancelEventArgs.Cancel = true;
      } 
   }
}

      

+3


source


Event arguments Closing

have a property Cancel

that must be set to true

if the user cancels the close. Therefore, your method Cleanup()

must return bool

and you must assign it to a property Cancel

.



+2


source







All Articles