WPF: Binden an eine Enumeration

Datenbindung (engl. Data binding) ist eines der Kernkonzepte innerhalb der WPF (Windows Presentation Foundation). Die WPF-Datenbindung bietet für Anwendungen eine einfache und konsistente Möglichkeit, Daten darzustellen und mit ihnen zu interagieren. Elemente können aus einer Vielzahl von Datenquellen in Form von CLR-Objekten (Common Language Runtime) an Daten gebunden werden. In vielen Beispielen zum WPF-Databinding wird gezeigt wie man die ItemsSource-Eigenschaft eines ItemsControls (z.B. ComboBox, ListView, DataGrid, usw) an eine Liste bindet. Will man jetzt die Werte einer Enumeration binden ist dies nicht ganz so einfach wie das DataBinding an eine Liste. Im folgenden Beitrag möchte ich jetzt anhand eines Beispiels zeigen wie man die Werte einer Enumeration als Datenquelle verwenden kann.

In meinem Beitrag .NET: ZIP-(Archiv) API im .NET Framework 4.5 stand ich vor der Aufgabe, die CompressionLevel-Enumeration aus dem System.IO.Compression-Namespace an eine ComboBox zu binden. Die Lösung dieses Problems liegt in der Verwendung einer ObjectDataProvider-Instanz und der statischen GetValues-Methode der Enum-Klasse.

Zunächst benötigt man eine Instanz der ObjectDataProvider-Klasse. Diese Klasse bietet die Möglichkeit, das entsprechende Objekt in XAML zu erstellen und es als Bindungsquelle verfügbar zu machen. Dafür werden noch diverse Eigenschaften bereitgestellt, die es ermöglichen, eine Abfrage auf das Objekt und eine Bindung an die zurückgelieferten Ergebnisse auszuführen. Dazu einmal das folgende Beispiel:

In dem oben gezeigten Beispiel wird eine ObjectDataProvider-Instanz erzeugt und einige Eigenschaften gesetzt. Die folgenden Eigenschaften sind dabei von Bedeutung:

  • ObjectType – Hier wird der Datentyp, von dem eine Instanz erstellt werden soll festegelegt. (innerhalb von XAML wird der Typ mit der x:Type-Markuperweiterung festgelegt, in oben gezeigtem Beispiel ist der Typ: sys:Enum (inkl. dem Präfix sys für den Namespace))
  • MethodName – Mit dieser Eigenschaft kann man eine Methode für den festegelegten Objekt-Typ aufrufen. Mit der MethodParameters-Eigenschaft ist es darüber hinaus möglich Parameter an die Methode zu übergeben. So kann man dann eine Bindung an die Ergebnisse der Methode herstellen. In dem oben gezeigten Beispiel wird die statische GetValues-Methode der Enum-Klasse aufrufen. Als MethodParameter wird der Name der gewünschten Enumeration mitgegeben (in diesem Fall „io:CompressionLevel“ wiederum mit Präfix für die Namespaceangabe)

Hinweis:

Schauen wir uns die GetValues-Methode einmal direkt als C#-Code an. Im folgenden Beispiel wird die GetValues-Methode mit der Enumeration System.IO.Compression.CompressionLevel als Parameter aufgerufen:

Hier das Ergebnis des Methoden-Aufrufs:

Enum_GetValues

Als Ergebnis wird ein Array mit den entsprechenden Enum-Werten zurückgeliefert. Dieses Array dient dann als Quelle für das Databinding.

Nun aber wieder zurück zum XAML-Code. Nachdem wir eine Instanz des ObjectDataProviders erstellt haben muss lediglich noch das eigentliche DataBinding hinzugefügt werden. Dafür haben wir unserer Instanz mit der StaticResource-Eigenschaft einen Namen zugewiesen, auf den wir jetzt verweisen. In etwa so:

Enum_DataBinding

Das ist auch eigentlich schon alles! Innerhalb der Demoanwendung für den Beitrag .NET: ZIP-(Archiv) API im .NET Framework 4.5 sieht das dann folgendermaßen aus (hier wurde, wie schon geschrieben, eine Enumeration an eine ComboBox gebunden):

Enum_DataBinding_UI

Der Quellcode für diese Demo-Anwendung kann im Beitrag .NET: ZIP-(Archiv) API im .NET Framework 4.5 heruntergeladen werden.

Fork me on GitHub