I'd like to handle the Closing
event (when a user clicks the upper right 'X' button) of my window in order to eventually display a confirm message or/and cancel the closing.
I know how to do this in the code-behind: subscribe to the Closing
event of the window then use the CancelEventArgs.Cancel
property.
But I'm using MVVM so I'm not sure it's the good approach.
I think the good approach would be to bind the Closing
event to a Command
in my ViewModel.
I tried that:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<cmd:EventToCommand Command="{Binding CloseCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
With an associated RelayCommand
in my ViewModel but it doesn't work (the command's code is not executed).
Best Answer
I would simply associate the handler in the View constructor:
Then add the handler to the
ViewModel
:In this case, you gain exactly nothing except complexity by using a more elaborate pattern with more indirection (5 extra lines of XAML plus
Command
pattern).The "zero code-behind" mantra is not the goal in itself, the point is to decouple ViewModel from the View. Even when the event is bound in code-behind of the View, the
ViewModel
does not depend on the View and the closing logic can be unit-tested.