Hallo,
Ich habe eine Applikation entwickelt nach den im Titel genannten Pattern. Um WPF ReDO/Undo Support zu spendieren, sehen die meisten stellen wo Commands exportiert werden in den ViewModels so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public ICommand OptimizeRoutePathCommand { get { return new WrapperCommand(new OptimizeRoutePathCommand(_route)); } } |
Ich binde also das ICommand in der View, und damit ich meine Liste von Commands führen kann, gibts um meine UnDoCommands ein WrapperCommand, was dann Execute/CanExecute an mein Command weiterleited, und beim Execute mein Command auch in die CommandHistory schreibt (Clone() des Commands).
Mein Problem ist nun folgendes: Irgendwie kann ich nicht genau steuern, wann ein Command neu erstellt wird, und wann lediglich das CanExecute aufgerufen wird. Evtl war das jetzt verwirrend ausgedrückt aber folgendes Fallbeispiel sollte mein Problem aufzeigen:
Ich habe ein Command, was zu der Aktiven Route Selektierte Wegpunkte hinzufügen muss. Ich könnte nun a) im Constructor des Commands jeweils die Aktive Route übergeben, oder b), dem RoutenCommand die möglichkeit geben, selber die Aktive Route ausfindig zu machen.
Ich würde a) bevorzugen, da ich dann das Command viel besser an anderen Orten nutzen kann, aktuell habe ich es aber nach b) gelöst.
Oder ist es generell die Idee, ein Command nur einmal zu instanzieren?
Konkret würde ich mich freuen, wenn jemand der unter WPF das Command Pattern mit Undo/Redo Support implemnetiert hat einige Tipps geben könnte, wie er das gelöst hat. M$ liefert leider nur spärliche Infos - die lösen das immer über RelayCommands (delegates) ohne Undo/Redo Support daher bringt mir das wenig.