Wie kann ich Abbrechen von bestimmten Formular nach Abbrechen Schaltfläche (oder X in der oberen rechten Ecke, oder Esc) geklickt wurde abgebrochen?Wie Fenster schließen in MVVM WPF-Anwendung
WPF:
<Window
...
x:Class="MyApp.MyView"
...
/>
<Button Content="Cancel" Command="{Binding CancelCommand}" IsCancel="True"/>
</Window>
Ansichtsmodell:
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;
}
}
Aktuelle Code funktioniert nicht. Ich möchte, dass der Benutzer auf dem aktuellen Formular bleibt, wenn er im Popup-Dialogfeld "Nein" wählt. Auch das Überschreiben von CanExecute hilft nicht. Es deaktiviert nur die Schaltfläche. Ich möchte dem Benutzer erlauben, den Knopf zu drücken, aber dann ihm mitteilen, dass Daten verloren gehen. Vielleicht sollte ich einen Ereignis-Listener auf Knopf zuweisen?
EDIT:
I Popup-Managed zeigt auf Abbrechen. Aber ich kann immer noch nicht Esc oder X-Taste (oben rechts) verwalten. Es scheint, dass ich mit der Schaltfläche "Abbrechen" verwechselt wurde, weil die Execute-Methode ausgeführt wird, wenn ich auf die Schaltfläche "X" oder "Esc" klicke.
EDIT2:
änderte ich die Frage. Es war "Wie Abbrechen Cancel-Taste". Es war jedoch nicht das, wonach ich suchte. Ich muss die Esc- oder X-Taste abbrechen. In 'MyViewModel' ich hinzufügen:
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;
}
}
}
Dies löste mein Problem. Ich brauche jedoch ICommand, um zu verstehen, auf welche Schaltfläche geklickt wurde, Speichern oder Abbrechen. Gibt es eine Möglichkeit, die Verwendung von Ereignissen zu eliminieren?
Hat Ihr 'viewModel.TryClose (false)' Funktion ein Ereignis Ihrer Ansicht sendet den Dialog zu schließen? Wenn ja, können Sie 'IsCancel =" true "' aus dem XAML-Code entfernen. Dieser Teil bewirkt, dass das Formular geschlossen wird. –
@ qqww2 Wenn ich IsCancel = "true" entferne, dann wenn ich Esc klicke, schließt es das Fenster nicht. Ich möchte, dass das Fenster auf Esc geschlossen wird. –
Registrieren Sie eine 'KeyBinding' zu Ihrem Befehl. [Hier] (http://stackoverflow.com/questions/19697106/create-key-binding-in-wpf) ist ein Beispiel. –