© deomis/Shutterstock.com
Teil 2: Eingabevalidierung in WinUI 3 - die Rückkehr von INotifyDataErrorInfo

Benutzereingaben validieren


Für das Entwickeln von datengetriebenen Enterprise-Applikationen ist das Validieren von Benutzereingaben eine Kernfunktionalität, die in der Universal Windows Platform (UWP) bisher fehlt. In der UWP muss eine Validierung händisch gebaut werden, sie wird nicht wie in WPF durch das Framework unterstützt. In WinUI ändert sich das. Das Konzept des aus der WPF bekannten INotifyDataErrorInfo-Interface kommt auch bei WinUI 3 zum Validieren von Benutzereingaben zum Einsatz. Dieser Artikel gibt einen Einblick, wie die Validierung damit funktioniert.

Die Windows Presentation Foundation (WPF) hat verschiedene Mechanismen, um Benutzereingaben zu validieren:

  • Exceptions

  • das IDataErrorInfo-Interface

  • das INotifyDataErrorInfo-Interface

Das INotifyDataErrorInfo-Interface ist die modernste Variante, die mit dem .NET Framework 4.5 eingeführt wurde. Das Interface bietet gegenüber den anderen Varianten einige Vorteile:

  1. Pro Eigenschaft lässt sich nicht nur ein einziger Validierungsfehler festlegen, sondern beliebig viele Validierungsfehler.

  2. Ein Validierungsfehler muss nicht zwingend ein String sein, es kann sich dabei auch um ein komplexes Objekt handeln. Dem Entwickler stehen somit alle Türen offen. Es lässt sich eine beliebige Fehlerklasse erstellen und verwenden.

  3. Validierungsfehler können auch asynchron ermittelt und im User Interface ausgegeben werden. Das funktioniert mit Hilfe des ErrorsChanged Events. Wird es ausgelöst, zeigt das UI die entsprechenden Validierungsfehler an. Damit lässt sich beispielsweise bei der Registrierung eines Benutzers asynchron prüfen, ob der Benutzername im Backend schon existiert.

All diese Vorteile machen das INotifyDataErrorInfo-Interface zur besten Wahl und zum Standard, wenn es in einer WPF-Anwendung zur Validierung von Benutzereingaben kommt. Aus diesem Grund haben sich die Entwickler bei Microsoft auch dazu entschieden, das INotifyDataErrorInfo-Interface in WinUI 3 zur Validierung zu unterstützen, nachdem auf GitHub [1] von einem Communitymitglied ein Issue bezüglich Eingabevalidierung erfasst wurde. Die anderen aus WPF bekannten Validierungsvarianten mit Exceptions und dem IDataErrorInfo-Interface werden hingegen in WinUI 3 nicht unterstützt.

Das INotifyDataErrorInfo-Interface

Seit der Version WinUI 3 Preview 1, die im Mai 2020 erschienen ist, lassen sich WinUI-3-Anwendungen aufbauend auf .NET 5 erstellen. Im aus dem .NET Framework bekannten Namespace System.ComponentModel enthält auch .NET 5 das INotifyDataErrorInfo-Interface.

Es besitzt drei Mitglieder: Eine HasErrors-Eigenschaft, ein ErrorsChanged Event und eine GetErrors-Methode. Listing 1 zeigt das Interface.

Listing 1: Das INotifyDataErrorInfo-Interface

public interface INotifyDataErrorInfo { bool HasErrors { get; } event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged; IEnumerable<object> GetErrors(string propertyName); }

Die HasErrors Property soll angeben, ob für das Objekt, das das Interface implementiert, Validierungsfehler vorliegen. Das ErrorsChanged Event soll ausgelöst werden, wenn sich die Validierungsfehler für eine bestimmte Property geändert haben, und die GetErrors-Methode gibt die Liste von Validierungsfehlern für eine bestimmte Property zurück.

Wie funktioniert das in der Praxis? Angenommen, es liegt eine FriendViewModel-Klasse vor, die eine FirstName Property für den Vornamen eines Freundes hat. Dann wird üblicherweise im User Interface die Text Property einer TextBox an die FirstName Property der FriendViewModel-Klasse gebunden (Abb. 1).

huber_WinUI_Validation_1.tif_fmt1.jpgAbb. 1: Die geplante ViewModel-Klassenhierarchie

Damit im Fall von Abbildung 1 beispielsweise die TextBox einen Validierungsfehler anzeigt, wenn die FirstName Property einen Leerstring enthält, muss die FriendViewModel-Klasse das INotifyDataErrorInfo-Interface implementieren. Ist das Interface implementiert, wird die TextBox automatisch auf das ErrorsChanged Event lauschen. Wird dieses Event für die FirstName Property ausgelöst, holt sich die TextBox die Validierungsfehler über die GetErrors-Methode ab und stellt sie im User Interface entsprechend dar, damit der Benutzer weiß, was zu tun ist.

Für das INotifyDataErrorInfo-Interface gibt es weder in der WPF noch in WinUI eine Implementierung. Das Interface zu implementieren, ist die Aufgabe des Entwicklers. Los geht’s!

ViewModels planen

Zum Implementieren des INotifyDataErrorInfo-Interfaces bietet sich eine Basisklasse an, von der alle ViewModel-Klassen der eigenen Anwendung ableiten können, um die Validierung zu nutzen. Doch neben dem INotifyDataErrorInfo-Interface sollte auch das für Data Bindings wichtige INotifyPropertyChanged-Interface implementiert werden. Es empfiehlt sich, eine ViewModel-Klasse...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang