Benutzer mit den meisten Antworten
WPF mehrere Commands pro Button?

Frage
-
Moin zusammen,
ich habe in einem Fenster die Buttons Speichern und Abbrechen jeweils mit einem Command und entsprechenden CommandParametern versehen.
Der Abbrechen-Button schließt nur das Fenster und ich übergebe über die CommandParameter das Fenster um es aus dem ViewModel schließen zu können. Ist das so richtig? Gibt es andere bessere Lösungen?
Das Problem aber habe ich beim Speichern-Button. Dort wird über den Command ein Eintrag in der Datenbank vorgenommen. Anschließend soll nach erfolgreicher Speicherung das Fenster geschlossen werden. Wie geht man da vor? Ein zweiten Command an den Button binden? Wie macht man das?
Antworten
-
Ja, mit Converter und MultiBinding geht das natürlich auch, also ohne eigene MarkupExtension.
Zwei Anmerkungen habe ich noch:
- Beim Binding mit ElementName muß man entweder noch Path="." hinzufügen, oder beim Converter den Mode=OneWay setzen. Ansonsten meckert bei mir zumindest der Designer und ich erhalte eine Exception beim Start.
- In der Convert() solltest du zuerst auf den Typ Window abfragen, da "is object" immer true ist.
Gruß
Heiko- Als Antwort vorgeschlagen Aleksander Chalabashiev Freitag, 25. September 2015 08:46
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 1. Oktober 2015 06:19
Alle Antworten
-
Hallo David,
man könnte einfach während der Abarbeitung des SaveCommands das CloseCommand auslösen, wenn beide im gleichen ViewModel enthalten sind. Ansonsten vielleicht von außen dem Model, das das SaveCommand bearbeitet, das CloseCommand oder das Window oder die Page übergeben, damit es nach erfolgreichem Speichern ausgelöst/geschlossen werden kann.
private void SaveKunde_Execute(object obj) { if (SaveKunde() == true) CloseCommand.Execute(obj); }
Mir ist nicht bekannt, daß man mehrere Commands für ein Ereignis registrieren kann. Man kann aber ein Ereignis hinterlegen, das dann mehrere Ereignisse von sich aus auslöst. Damit hast du dann auch die Kontrolle darüber, ob je nach Erfolg/Mißerfolg nachfolgende Command noch ausgelöst werden dürfen. Ist dann nur die Frage, ob man alle Parameter zur Verfügung hat, die die Command jeweils brauchen.
Gruß
Heik0- Bearbeitet Heiko65456465 Donnerstag, 10. September 2015 09:48
-
Hallo Heiko,
danke für deine Antwort. Die Idee gefällt mir soweit ganz gut. Nun habe ich gesehen, dass zum übergeben von mehreren CommandParametern man wieder einen Converter braucht. Das werde ich dann als nächstes angehen.
Die Commands sind alle im ViewModel vorhanden.
Fazit nach paar Wochen WPF: Man kann sehr viel machen! Aber das MVVM Pattern ist ein echt hartes Stück Brot wenn man sich da einarbeitet.
-
... zum übergeben von mehreren CommandParametern man wieder einen Converter braucht.
...ich vermute, du meinst eine MarkupExtension, also eine Klasse, die du als Ableitung von MarkupExtension selbst erstellst, die du dann als CommandParameter einsetzt. Die verschiedenen Parameter werden dann der MarkupExtension übergeben.
Gruß
Heiko -
Ja ich denke das meine ich :-)
MultiBinding erfordert ja einen Converter. Diesen habe ich SafeAndCloseParametersConverter benannt und dann werden die Bindings hinzugefügt.
Die Klasse SafeAndCloseParameters schaut wie folgt aus:
public class SafeAndCloseParameters { public object parameter { get; set; } public Window window { get; set; } }
und den SafeAndCloseParametersConverter:
public class SafeAndCloseParametersConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { SafeAndCloseParameters parameters = new SafeAndCloseParameters(); foreach (var para in values) { if (para is object) parameters.parameter = para; else if (para is Window) parameters.window = para as Window; } return parameters; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }
Und meine View:
<Button Grid.Column="0" Command="{Binding SpeichernCommand}" > <Button.CommandParameter > <MultiBinding Converter="{StaticResource SafeAndCloseParametersConverter}"> <Binding Path="StörungslogbuchMeldung" /> <Binding ElementName="frmStörungsMeldung" /> </MultiBinding> </Button.CommandParameter> <StackPanel> <Image Source="/Resources/Apply.png" Width="20" /> <Label Content="Speichern" /> </StackPanel> </Button>
Na schauen wir mal ob ich damit mal zum Ziel komme :-)
-
Ja, mit Converter und MultiBinding geht das natürlich auch, also ohne eigene MarkupExtension.
Zwei Anmerkungen habe ich noch:
- Beim Binding mit ElementName muß man entweder noch Path="." hinzufügen, oder beim Converter den Mode=OneWay setzen. Ansonsten meckert bei mir zumindest der Designer und ich erhalte eine Exception beim Start.
- In der Convert() solltest du zuerst auf den Typ Window abfragen, da "is object" immer true ist.
Gruß
Heiko- Als Antwort vorgeschlagen Aleksander Chalabashiev Freitag, 25. September 2015 08:46
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 1. Oktober 2015 06:19