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?
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
Vous devez vous connecter pour publier un commentaire.
Vous essayez de faire de Vue du travail en classe ViewModel. Laissez votre avis classe permettant de gérer la fermeture de la demande et si elle doit être annulé ou pas.
Pour annuler la fermeture d'une fenêtre, vous pouvez vous abonner à la
Closing
cas d'afficher et de définir lesCancelEventArgs.Cancel
à vrai après montrant unMessageBox
.Voici un exemple:
Code derrière:
Ok. Pouvez-vous expliquer en détail ce qu'est l'algorithme pour fermer la fenêtre?
- Je attribuer gestionnaire dans le ViewModel de la OnClosing même. Comme je l'ai dit après EDIT2. Toutefois, dans ce cas, je ne peux pas distinguer COMMENT ot a été fermé. Je veux dire, sans l'ajout d'options supplémentaires, dont je vais le mettre dans ICommand.
Ne
false
dansviewModel.TryClose(false)
dire qu'elle est appelée à partir de l'INTERFACE utilisateur ou le code? Aussi, édité code n'est pas une manière désirée dans MVVM.faux est utilisé uniquement dans CancelCommand
OriginalL'auteur Yusuf Tarık Günaydın
Très bon exemple de cela dans le Modèle de Vue peut être trouvé dans l'article de Nition Nishant, où il utilise les propriétés attachées aux crochet jusqu'à la fenêtre des événements avec les commandes.
Exemple de code d'attachée de comportement (auteur du code: De Nition Nishant)
Exemple comment lier les commandes:
Commandes "ClosedCommand", "ClosingCommand" et "CancelClosingCommand" devrait être défini dans la Vue Modèle.
OriginalL'auteur torpederos