Das von mir verstandene Ziel des Befehlsmusters besteht darin, die Benutzeroberflächeninteraktion von der Anwendungslogik zu trennen. Mit richtig implementierten Befehle, ein Klick auf einen „Print“ Menüpunkt könnte in einer Kette von Interaktion wie folgt ergeben:Führt WPF Routed Commands ein Problem oder verschlimmert es?
(button) ---click executes command----> (command) ---calls Print() in app logic ---> (logic)
Dies fordert Sie dazu auf die Benutzeroberfläche von der Anwendungslogik zu trennen.
Ich habe WPF-Befehle untersucht, und zum größten Teil sehe ich, wie sie dieses Muster implementiert haben. Allerdings habe ich das Gefühl, bis zu einem gewissen Grad haben sie komplizierte das Command-Muster und verwaltet, um es so zu implementieren, dass Sie von der Trennung der Benutzeroberfläche von Anwendungslogik entmutigen.
Betrachten wir zum Beispiel diese einfache WPF-Fenster, das eine Schaltfläche Text in das Textfeld einzufügen hat:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Paste"
Executed="CommandBinding_Executed"/>
</Window.CommandBindings>
<StackPanel>
<TextBox x:Name="txtData" />
<Button Command="Paste" Content="Paste" />
</StackPanel>
</Window>
Hier ist der Code-behind:
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
ApplicationCommands.Paste.Execute(null, txtData);
}
}
}
Was habe ich von der gewinnen Befehl? Es scheint mir, dass ich genauso einfach den Code vom Kommandoverhandlungs-Event-Handler in das Click
Ereignis der Schaltfläche gesetzt haben könnte. Sicher, jetzt kann ich mehrere UI-Elemente mit dem Befehl Einfügen verbinden und ich muss nur den einen Event-Handler verwenden, aber was, wenn ich in mehrere verschiedene Textfelder einfügen möchte? Ich müsste die Event-Handler-Logik komplizierter machen oder mehr Event-Handler schreiben. So, jetzt fühle ich mich wie ich habe:
(button) ---executes Routed Command---> (Window) ---executes command binding----(command binding)
(logic) <---calls application logic--- (event handler) <-----raises event --------------|
Was fehlt mir hier? Es sieht für mich wie eine zusätzliche Ebene der Indirektion aus.
Ich las ein Buch Kapitel auf Befehle letzte Nacht und fand diese Informationen, dann fühlte mich prompt wie ein Dope. – OwenP