Kann ich mehrere CommandBindings für denselben Befehl auf demselben Steuerelement haben?

9

Ich habe ein UserControl, das seiner CommandBindings-Auflistung ein CommandBinding hinzufügt, um einen bestimmten Befehl zu behandeln. Später verwende ich dieses Steuerelement in einem Fenster und möchte diesem Steuerelement eine weitere Bindung hinzufügen, um zusätzliches Verhalten hinzuzufügen. Das Problem ist jedoch, dass, wenn ich das tue, scheint, dass, wenn ich ein anderes CommandBinding der CommandBindings-Auflistung eines Steuerelements hinzufüge, dass es jede Bindung ersetzt, die für dasselbe Command bereits vorgenommen wurde. Es sieht so aus, als ob ein Steuerelement nur ein einziges CommandBinding pro Steuerelement haben kann. Ist das korrekt?

Siehe das Codebeispiel unten, das versucht, zwei CommandBindings für den gleichen Speicherbefehl zu setzen.

%Vor%

Ursprünglich hatte ich beim Schreiben dieses Codes entweder eine Kompilierungszeit- oder eine Laufzeit-Ausnahme erwartet, war aber überrascht, dass sie sich nicht beschwert hat. Als nächstes war ich enttäuscht, da mein CommandBinding_Executed-Handler nur einmal statt zweimal aufgerufen wurde, wie ich es mir erhofft hatte.

Aktualisierung: Nach ein paar Tests scheint es, dass meine zweite CommandBinding nicht meine erste überschreibt, aber stattdessen scheint es, dass obwohl ich Handled in meinem Event-Handler nicht auf true setze, dass die erste Befehlsbindung den Befehl verschluckt. Ich bin mir ziemlich sicher an dieser Stelle, dass die Lösung für mein Problem darin besteht, zu verstehen, warum sich der weitergeleitete Befehl nicht über den ersten Handler hinaus ausbreitet, selbst wenn Handled nicht auf true gesetzt ist.

Aktualisierung: Ich habe diesen tollen kleinen Leckerbissen von Informationen gefunden, die nur einige der seltsamen Verhaltensweisen hinter dem Command routing bestätigen WPF.

Aktualisierung: Ein Gedanke darüber, wie man die Tatsache umgehen kann, dass es nur einen einzigen effektiven CommandBinding pro Befehl geben kann, ist, dass die Standard CommandBinding-Klasse Executed und CanExecute als Ereignisse verfügbar macht, die natürlich wie alle Ereignisse mehrere Handler haben können. Die Idee besteht dann darin, eine andere Methode als die Standardmethode CommandBindings.Add zu verwenden, um einem Befehl zusätzliche Handler hinzuzufügen. Vielleicht könnte dies über eine Erweiterungsmethode für die Control-Klasse und eine Verknüpfung mit einer benutzerdefinierten CompositeCommandBinding-Klasse erfolgen, die es uns ermöglicht, mehrere Bindungen innerhalb einer Hauptbindung zu aggregieren.

    
jpierson 18.02.2010, 16:18
quelle

2 Antworten

3

Bisher war ich nur in der Lage, eine Problemumgehung für dieses Problem zu finden, nämlich den Befehl auf zwei verschiedenen Ebenen im logischen Baum zu behandeln. Im folgenden Beispiel behandle ich den Speichern-Befehl in meinem Grid und dann auch wieder innerhalb des Window-Elements.

%Vor%

Um dies zum Laufen zu bringen, muss mein Code hinter die Befehlsausführung auch manuell auf die nächst höhere Ebene propagieren.

%Vor%

Wenn jemand bessere Ideen hat, wie ich einen Befehl überwachen kann, lasse ihn sich natürlich auf dem Baum ausbreiten, würde ich es gerne sehen, sonst könnte ich einfach auf diese Problemumgehung zurückgreifen.

    
jpierson 18.02.2010 21:03
quelle
1

Ich kenne die Antwort auf Ihre Frage nicht, aber Reflector klingt für mich vernünftig.

Ich frage mich, warum machst du das? Vielleicht macht es mehr Sinn, das Composite -Muster zu verwenden, um Verhaltensweisen zu aggregieren, anstatt zu versuchen, Befehlsbindungen zu kombinieren?

>     
Anvaka 18.02.2010 17:15
quelle

Tags und Links