Eine Liste von konstanten Werten an ein Auswahlelement anzubinden ist eine Aufgabe, welche oftmals in MAUI/WPF gefordert wird. Es gibt allerdings keine standardisierte/interne Lösung zum Anbinden eines Enums. Die gängige Lösung ist, eine eigene MarkupExtension zu definieren und im XAML zu verwenden. In diesem Blogartikel werde ich erläutern, wie eine MarkupExtension funktioniert und wie eine Enum-Extension aussehen kann.
Was ist eine MarkupExtension?
Eine MarkupExtension ist die grundlegende Komponente um im XAML Daten einzubinden. In MAUI/WPF gibt es mehrere MarkupExtensions, welche jedem Entwickler in den genannten Frameworks bekannt sein sollten:
- Binding
- StaticResource
- DynamicResource
- TemplateBinding
- ...
Weiters, ist eine MarkupExtension eine C#-Klasse, welche auf andere Klassen vererbt werden kann. Durch diese Vererbung, können eigene MarkupExtensions definiert werden, um beliebige Daten an das Frontend (XAML) weiterzugeben.
Wie funktioniert eine MarkupExtension?
Die MarkupExtension Klasse ist eine abstrakte Klasse, welche genau eine Methode voraussetzt: ProvideValue. Diese Methode hat den Rückgabetyp object, durch diesen kann eine beliebige Liste zurückgegeben werden (Array, List, ...). Diese Liste wird in weiterer Folge an das XAML weitergegeben und eingebunden, falls möglich.

Der Parameter "serviceProvider" wird verwendet, um Daten bei der Ausführung der MarkupExtension weiterzugeben (u.a. die Quelle der Daten). Für diese Aufgabe (Enum anbinden) kann dieser Parameter ignoriert werden.
MarkupExtension in Action
Wie sieht eine konkrete Implementation einer MarkupExtension aus? Es folgen zwei Beispiele, ein Beispiel mit einer simplen Liste von Integern, und das konkrete Beispiel mit einem Enum.
Beispiel 1:
Aufgabenstellung: Zeige die Zahlen von 1-5 in einer ListBox an
MarkupExtension:

XAML:

Bei der ItemsSource kann nun einfach der Name der Extension-Klasse (IntegerExtension) angegeben werden, um die Extension zu benutzen. Das Wort "Extension" der Klasse kann hier weggelassen werden. Der Namespace (local:) muss im Window selbst definiert sein, um Zugriff auf die MarkupExtension zu bekommen.
Beispiel 2:
Aufgabenstellung: Enum an eine ComboBox anbinden
Bei diesem Beispiel wird als Input für die MarkupExtension der Typ des Enums benötigt. Hier muss ein Parameter des Enumtypens definiert werden. Dieser Parameter kann als simples Property in der Klasse angelegt werden, und dann im XAML per "PropertyName=" übergeben werden.
MarkupExtension:

XAML:
