Kolumne: XAML Expertise

XAML-Tipp: WPF: – Data Binding auf Events
Keine Kommentare

In der Kolumne „XAML Expertise“ präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertise: „WPF: Data Binding auf Events“

Die Implementierung des Entwurfmusters MVVM (Model View ViewModel) bringt einen enormen Vorteil mit sich: die hundertprozentige Trennung von Design- und Businesslogik mittels Data Binding. Im ViewModel wird die Oberfläche anhand von Properties abgebildet. Dabei gelten für Aktionen wie das Auslösen eines einfachen Buttons, dass das Handling mittels Commands umgesetzt wird. Hier stoßen wir allerdings auch auf einen großen Nachteil: Commands beschränken sich nur auf die gängigen Standardaktionen. Dabei wird zum Beispiel nur beim Betätigen eines Buttons das Command ausgelöst. Bei einer ListView wäre dies wiederum die Auswahl eines Items.

Ein weiteres Problem ist die Tatsache, dass man leider auf keine weiteren Events der Steuerelemente reagieren kann. In manchen Situationen können die Informationen zwar über CommandParameter übertragen werden; die Problematik mit den fehlenden Informationen begegnet einem aber immer wieder. Zudem möchte man Commands eventuell gar nicht auf die Standardaktionen binden. Viel eleganter wäre es, wenn man auf jeden beliebigen Event eines Controls ein Command auslösen könnte. Um das zu erreichen, müsste man vom ViewModel aus auf den EventManager zugreifen. Das ist allerdings nicht so einfach. Erstens benötigt man mehr Zeilen Code und zweitens besteht eine gewisse Abhängigkeit zu den jeweiligen Controls. Als weiteres Problem käme ein Memory Leak des Command Bindings hinzu, das bereits seit der ersten WPF- und Silverlight-Version besteht.

Um diesem Problemen zu entgehen, bietet Blend for Visual Studio mit Behaviors die ultimative Lösung. Dabei handelt es sich um fertige UI-Funktionalitäten, die als Snippet auf das gewünschte Steuerelement gezogen werden. Behaviors, wie Blend for Visual Studio sie anbietet, sind schon seit Expression Blend 4 für WPF und Silverlight bekannt (Tabelle).

Name Funktion
CallMethodAction Löst bei einem bestimmten Event eine beliebige Methode eines Zielobjekts (z. B. ViewModel) aus. Dabei werden die jeweiligen EventArgs mitübertragen.
ChangePropertyAction Bei einem Event wird einer Property eines beliebigen Zielobjekts (z. B. ViewModel) nach einer beliebigen Iteration ein Wert zugewiesen.
InvokeCommandBehavior Erweitert ein Control durch ein Command, das auch auf jedem beliebigen Event ausgelöst werden kann. Es werden dabei keine EventArgs übertragen, nur CommandParameter.

Tabelle: Behaviors in Blend for Visual Studio

Ein einfaches Beispiel ist das Abfangen des SelectionChanged-Events innerhalb einer Liste. Dazu wird zuerst ein WPF-Projekt angelegt und mit einer ListView bestückt. Als nächstes wird das ViewModel angelegt. Dazu wird eine einfache Klasse mit dem Namen MainWindowViewModel erzeugt. Ihr werden eine Methode und die dazugehörige SelectionChangedEventArgs-Signatur hinzugefügt (Listing 1).

public class MainWindowViewModel
{
  public void SelectionChangedMethod(object sender, SelectionChangedEventArgs e)
  {
    ListViewItem selectedItem = (ListViewItem)e.AddedItems[0];
    MessageBox.Show("Hallo mein Name ist " + selectedItem.Content);
  }
}

Das ViewModel muss anschließend im Ressourcenbereich der dazugehörigen View instanziiert werden. In Listing 2 werden die MainPage.xaml und das Instanziieren des MainWindowViewModel gezeigt.

<Window x:Class="WpfBindingEvents.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:local="clr-namespace:WpfBindingEvents"
  mc:Ignorable="d"
  Title="Behavior Beispiel" Height="350" Width="525">
<Window.Resources>
  <local:MainWindowViewModel x:Key="ViewModel" />
</Window.Resources>
  <Grid DataContext="{StaticResource ViewModel}">
    <ListView Margin="10">
      <ListViewItem Content="Christine Biswanger"/>
      <ListViewItem Content="Raphael Biswanger"/>
      <ListViewItem Content="Gregor Biswanger"/>
    </ListView>
  </Grid>
</Window>

Jetzt wird das benötigte Behavior hinzugefügt, indem wir das aktuelle Projekt in Blend for Visual Studio öffnen. Dazu auf das WPF-Projekt rechtsklicken und im Kontextmenü Design in Blend auswählen. Die Behaviors können im Assets-Fenster unter dem Punkt Behaviors gefunden werden. Das CallMethodAction Behavior muss dann mittels Drag and Drop auf die ListView gezogen werden (Abb. 1).

Abb. 1: Das „CallMethodAction“ Behavior auf die ListView ziehen

Abb. 1: Das „CallMethodAction“ Behavior auf die ListView ziehen

Für die Konfiguration der Einstellungen eines Behaviors muss im Objects and Timeline-Fenster das jeweilige Control aufgeklappt werden (Abb. 2). Hier befinden sind alle definierten Behaviors. Nachdem das gewünschte Behavior ausgewählt wurde, sind sämtliche Einstellungen rechts im Property-Fenster zu finden. Beim Trigger-Bereich wird unter dem EventName der SelectionChanged-Event ausgewählt. Im Common-Bereich muss nun als TargetObject ein Binding zum ViewModel erfolgen. Dann muss noch der Methodenname eingetragen werden. Ganz wichtig ist hierbei, dass der Methodenname ohne Klammern eingetragen wird. Die XAML-Datei sollte sich nun automatisch erweitert haben.

Abb. 2: „CallMethodAction“ Behavior konfigurieren

Abb. 2: „CallMethodAction“ Behavior konfigurieren

In diesem Beispiel wird nach dem Klick auf ein ListView-Item eine Messagebox geöffnet. Dies dient allerdings nur als Beispiel. In der Regel wird ein MessageBox.Show-Aufruf nicht direkt innerhalb des ViewModels getätigt. Das Gleiche gilt für den Zugriff auf die EventArgs, wobei das bei zahlreichen Projekten aus praktischen Gründen auch ohne Probleme funktioniert hat. Die Testbarkeit war ebenfalls vorhanden. Startet man nun die Anwendung, wird nach dem Klick auf ein ListView-Item die Messagebox mit dem entsprechenden Inhalt angezeigt (Abb. 3).

Abb. 3: Die Auswahl eines Items wird in einer Messagebox dargestellt

Abb. 3: Die Auswahl eines Items wird in einer Messagebox dargestellt

Das Tooling mit Blend ist nur beim ersten Mal notwendig, da Blend dabei wichtige DLL-Dateien referenziert und den nötigen XAML-Code generiert. Anschließend reicht es aus, den generierten XAML-Code zu kopieren und an entsprechender Stelle einzufügen.

Behaviors sind eine wichtige Unterstützung bei der WPF-Entwicklung geworden. Mit ihnen zu arbeiten, ist zeitsparend, da nicht so viel Code geschrieben werden muss und man sie immer wieder verwenden kann. Zahlreiche mitgelieferte Behaviors erleichtern das Entwicklerleben – nicht nur beim Data-Binding auf Events: Auch der Übersichtlichkeit des eigenen Codes sind sie zuträglich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -