Frage

Von dem, was ich verstehe, ist das Ziel des Befehlsmusters von Anwendungslogik getrennt UI Interaktion zu helfen. Mit richtig implementierten Befehlen, ein Klick auf einem „Print“ Menüpunkt in einer Kette von Interaktion wie dies zur Folge haben könnte:

(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 mich auf WPF-Befehle, und zum größten Teil ich sehe, wie sie dieses Muster implementiert haben. Aber ich fühle mich wie zu einem gewissen Grad haben sie kompliziert die Command-Muster und schaffte es so zu implementieren, die Sie von Trennen des UI von Anwendungslogik abgeraten.

Zum Beispiel, betrachten Sie diese einfachen WPF-Fenster, das eine Schaltfläche hat Text in das Textfeld einzufügen:

<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 dem Befehl zu gewinnen? Es scheint mir, dass ich einfach den Code aus der Befehlsbindung Event-Handler in die Click-Ereignis der Schaltfläche setzte genauso haben könnte. Sicher, jetzt kann ich mehrere UI-Elemente mit dem Befehl Einfügen verknüpfen und ich nur den einen Event-Handler verwenden müssen, aber was ist, wenn ich auf mehrere verschiedene Textfelder eingefügt werden soll? Ich würde die Event-Handler-Logik komplizierter oder mehr Event-Handler schreiben machen. So, jetzt fühle ich mich wie ich dies:

(button) ---executes Routed Command---> (Window) ---executes command binding----(command binding)
(logic) <---calls application logic--- (event handler) <-----raises event --------------|

Was bin ich hier? Es sieht aus wie eine zusätzliche Schicht von Dereferenzierung zu mir.

War es hilfreich?

Lösung

Zusätzlich zu den Dingen schon erwähnt, was Sie in Ihrem speziellen Paste Beispiel vergessen haben sind die Command und Command Eigenschaften. Für Paste können Sie einen Text, indem Sie als Command angeben.

Diese Eigenschaften sind absolut notwendig, wenn die gleiche RoutedCommand von verschiedenen Steuerungen verwendet werden sollen. Sie ermöglichen es, die Ausgeführt Handler über den Kontext einige Informationen zu geben, in dem der Befehl aufgerufen wird.

Andere Tipps

Sie können verwirrend Konzepte sein.

Die ICommand-Schnittstelle unterstützt den Befehl Muster. Das ermöglicht es Ihnen, zu abstrahieren Benutzeraktionen in eine wiederverwendbare Klasse.

Weitergeleitete Befehle sind eine spezielle Implementierung von ICommand, die für Handler durch die visuelle Struktur zu suchen. Sie sind besonders nützlich für Befehle, die von vielen verschiedenen Kontrollen durchgeführt werden kann, und Sie wollen, dass die Stromsteuer es zu handhaben. Denken Sie Kopieren / Einfügen. Es könnte eine ganze Reihe von Kontrollen, die damit umgehen können, aber durch den gerouteten Befehl, das Befehlssystem geleitet werden feststellen, automatisch die richtige Kontrolle des Befehl zu verarbeiten, basierend auf Fokus.

Ich würde bevorzugt die RoutedCommands und RoutedUICommands verwenden, wenn Kontrollen zu bauen. Zum Beispiel TextBox implementiert die UndoCommand für Sie und der Eingang guseture bereits auf Strg + Z gebunden. Wenn Ansicht Modelle bauen, jedoch ist meine Vorliebe für eine benutzerdefinierte ICommand mit internen Implementierungen von Execute und CanExecute. Die DelegateCommand stellt diese in Prism. Dies ermöglicht die Ansicht / XAML-Designer nur über den Befehl zu kümmern und nicht die richtigen Handler ausführen / CanExecute zu verwenden. Dies würde für eine ausdrucksAnsichtsModell ermöglichen.

ps. Delegieren Befehle nicht funktionieren noch (elegant) mit Inputbindings. Kann jemand bei Microsoft dieses Problem beheben bitte!

Sie können für einige Dinge zu viel des Guten, aber Sie haben einige nette Vorteile wie CanExecute erhalten, die automatisch / deaktivieren Tasten aktivieren / Menüpunkte, wenn der Befehl nicht verfügbar (wie kein Text ausgewählt, etc.) ist. Sie können auch Befehl Sachen in der Mischung tun, ohne Code zu verwenden, die für Designer groß ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top