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 to share