28 WPF-Commands
Im Vergleich der WinForm-API mit der WPF fällt ein wesentliches Unterscheidungskriterium sofort ins Auge: Die Oberflächenbeschreibung ist von der hinter den Elementen befindlichen Programmlogik strikt getrennt. Commands treiben diese Trennung sogar auf ein noch höheres Niveau, denn sie ermöglichen das Schreiben von Programmlogik, so dass alle wesentlichen Operationen sogar vollkommen unabhängig von der Oberfläche werden, die konsequenterweise sogar ausgetauscht werden kann. Umgesetzt wird dieses Prinzip mit einem Konzept, das als Model View ViewModel (MVVM) bekannt geworden ist.
Wir wollen auf dieses Pattern in diesem Buch nicht vertiefend eingehen und uns nur am Ende des Kapitels mit einem einführenden Beispiel begnügen. Auch für die Entwickler, die nicht die absolute Trennung zwischen der Oberfläche (View) und dem Programmcode verfolgen, bietet das Command-Konzept genügend Anreize, dessen Fähigkeiten zu nutzen. Das wird der Schwerpunkt dieses Kapitels sein.
28.1 Allgemeine Beschreibung
Das Konzept der Commands ist im ersten Moment vielleicht etwas komplex. Wir wollen uns daher zuerst einmal einen Überblick über die an diesem Konzept Beteiligten verschaffen:
- Command: Ein Kommando beschreibt eine bestimmte Aufgabe. Dabei wird verfolgt, ob der Command ausgeführt werden kann oder nicht. Wie Sie noch weiter unten sehen werden, beinhalten die Commands nicht die Logik der Aufgabe.
- Command-Quelle: Mit der Quelle ist die Komponente gemeint, die einen Command anstößt. Das kann ein Button oder auch beispielsweise ein Menüelement sein. Allen Quellen ist gemeinsam, die Schnittstelle ICommandSource zu implementieren.
- Command-Ziel: Damit ist das Element gemeint, auf dem das Kommando ausgeführt wird. In den Beispielen weiter oben waren Textboxen das Ziel.
- Command-Bindung: Eine Bindung sorgt für die Verknüpfung eines Commands mit der Anwendungslogik.
28.1.1 Ein einführendes Beispiel
In einem ersten Beispiel möchte ich Ihnen zeigen, wie vordefinierte Commands verwendet werden. Es sei bereits an dieser Stelle angedeutet, dass es nicht immer ganz so einfach ist, wie in diesem Beispiel gezeigt.
Abbildung 28.1 Das Fenster des Beispiels »Sample1«
Das Fenster enthält eine Menü- und eine Symbolleiste, im Arbeitsbereich des Fensters befinden sich zwei Textboxen. Sowohl die Menü- als auch die Symbolleiste ermöglichen, den in einer der beiden Textboxen markierten Text in die Zwischenablage zu kopieren bzw. den Inhalt der Zwischenablage einzufügen.
// Beispiel: ..\Kapitel 28\RoutedCommands\Sample1
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="Bearbeiten">
<MenuItem Command="ApplicationCommands.Copy" />
<MenuItem Command="ApplicationCommands.Paste" />
</MenuItem>
</Menu>
<ToolBarTray DockPanel.Dock="Top">
<ToolBar>
<Button Width="30" Height="30" Command="ApplicationCommands.Copy">
<Image Source="CopyHS.png" />
</Button>
<Button Width="30" Height="30" Command="ApplicationCommands.Paste">
<Image Source="PasteHS.png" />
</Button>
</ToolBar>
</ToolBarTray>
<StackPanel>
<TextBox Name="text1" Margin="10,10,10,5" Height="40"
Background="AntiqueWhite" FontSize="18"></TextBox>
<TextBox Name="text2" Margin="10,5,10,10" Height="40"
Background=" AntiqueWhite" FontSize="18"></TextBox>
</StackPanel>
</DockPanel>
Listing 28.1 Einfacher Einsatz von »Commands«
Solange kein Text in einer der beiden Textboxen markiert ist, ist das entsprechende Menüelement zum Kopieren bzw. die entsprechende Schaltfläche in der Symbolleiste deaktiviert. Das ändert sich, sobald eine Textpassage markiert ist. Nun wird es möglich, über das Menü oder die Symbolleistenschaltfläche den markierten Text in die Zwischenablage zu kopieren. Das ist natürlich völlig unabhängig von der TextBox – es funktioniert mit beiden. Es ist keinerlei Code notwendig, und dennoch arbeitet die Anwendung wie erwartet. Das Programm ist somit voll funktionstüchtig. Beachten Sie außerdem, dass für die Menüelemente und die Symbolleistenschaltflächen keine Beschriftung im XAML-Code angegeben ist. Dass diese Komponenten dennoch korrekt beschriftet werden, ist ebenfalls auf die Commands zurückzuführen. Die Magie wird durch die Bindung der Befehle Copy und Paste an die Symbolleistenschaltflächen und die Menüelemente mit
Command="ApplicationCommands.Copy"
und
Command="ApplicationCommands.Paste"
erreicht. Auch die kürzeren Varianten
Command="Copy"
Command="Paste"
sind erlaubt und werden von der Laufzeit richtig aufgelöst.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.