Comment faire pour annuler la fermeture de fenêtre en application WPF MVVM

Comment puis-je annuler la sortie de la forme particulière après le bouton Annuler (ou X dans le coin supérieur droit, ou Esc) a été cliqué?

WPF:

<Window
  ...
  x:Class="MyApp.MyView"
  ...
/>
  <Button Content="Cancel" Command="{Binding CancelCommand}" IsCancel="True"/>
</Window>

ViewModel:

public class MyViewModel : Screen {
  private CancelCommand cancelCommand;
  public CancelCommand CancelCommand {
    get { return cancelCommand; }
  }
  public MyViewModel() {
    cancelCommand = new CancelCommand(this);
  }
}

public class CancelCommand : ICommand {

  public CancelCommand(MyViewModel viewModel) {
    this.viewModel = viewModel;
  }

  public override void Execute(object parameter) {
    if (true) { //here is a real condition
      MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show(
        "Really close?",  "Warning", 
        System.Windows.MessageBoxButton.YesNo);
      if (messageBoxResult == MessageBoxResult.No) { return; }
    }
    viewModel.TryClose(false);
  }

  public override bool CanExecute(object parameter) {
    return true;
  }
}

Code actuel ne fonctionne pas. Je veux utilisateur de rester sur la forme actuelle, si elle choisit " Non " dans la boîte de dialogue contextuelle.
Aussi, en remplaçant CanExecute ne l'aide pas. Il a juste désactive le bouton. Je veux permettre à l'utilisateur d'appuyer sur le bouton, mais alors informer lui/elle, que les données seront perdues.
Je devrais peut-être attribuer un écouteur d'événement sur le bouton?

EDIT:

J'ai réussi montrant popup sur le bouton Annuler. Mais je ne peux pas gérer Esc ou X bouton (en haut à droite). Il semble que j'avais confondu avec le bouton Annuler, parce que la méthode Execute est exécutée lorsque je clique sur le bouton X ou la touche Echap.

EDIT2:

J'ai changé la question. C'était "comment annuler bouton Annuler'. Cependant, ce n'était pas ce que je cherchais. J'ai besoin d'annuler la touche Echap ou X bouton.
Dans "MyViewModel" je ajouter:

        protected override void OnViewAttached(object view, object context) {
            base.OnViewAttached(view, context);
            (view as MyView).Closing += MyViewModel_Closing;
        }

        void MyViewModel_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
            if (true) {
                MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show(
                  "Really close?",  "Warning", 
                  System.Windows.MessageBoxButton.YesNo);
                if (messageBoxResult == MessageBoxResult.No) {
                    e.Cancel = true;
                }
            }
        }

Cela a résolu mon problème. Cependant, j'ai besoin de ICommand à comprendre, le bouton qui a été cliqué, Enregistrer ou Annuler. Est-il possible d'éliminer l'utilisation de l'événement?

Est-ce que votre viewModel.TryClose(false) fonction envoie un événement à votre vue pour fermer la boîte de dialogue? Si oui, vous pouvez supprimer IsCancel="true" de code xaml. La partie les causes de la forme à proximité.
si je supprime IsCancel="true" alors si je clique sur la touche Echap, il ne ferme pas la fenêtre. Je veux que la fenêtre sera fermée sur la touche Echap.
Enregistrer un KeyBinding de votre commande. Ici en est un exemple.

OriginalL'auteur Andrii Muzychuk | 2016-03-21