head.WriteLine()

Donnerstag, August 25, 2011

TT.DataForm: MVVM Support

Bei der Entwicklung von TT.DataForm habe ich besonderen Wert auf den MVVM-Support gelegt. Dies betrifft sowohl die Datenbindung, als auch die Operationen die der Benutzer über die Oberfläche auslösen kann. Hierfür stehen entsprechende Command-Eigenschaften bereit, mit denen einen ViewModel das Control steuern kann.
  • AddCommand: Legt einen Command für die Neuanlage eines Datensatzes fest.
  • RemoveCommand: Legt einen Command für das Entfernen von Datensätzen fest.
  • SelectionButtonCommand: Legt den Command für die Auswahlschaltfläche von Bildern fest.
Für die Navigation stehen keine separaten Commands zu Verfügung, da diese idealerweise über eine entsprechende die Datenquellen-View, wie ICollectionView oder IEditableCollectionView gesteuert werden können.

In manchen Fällen muss das ViewModel jedoch aktiv mit der DataForm kommunizieren. So sollte zum Beispiel vor dem Speichern der Änderungen die aktive Eingabe abgeschlossen werden, um den gerade eingegebenen Wert in die Datenquelle zu übertragen. Hierfür stellt DataForm die Methode AcceptChanges().

Da das ViewModel jedoch nicht direkt mit der Komponente kommunizieren kann, werden die wichtigsten Methoden in einem so genannten ActionCommand abstrahiert. Hierbei stellt das ViewModel eine Eigenschaft vom Typ ActionCommand zu Verfügung, die an die gleichnamige Eigenschaft der DataForm gebunden wird. Daraufhin kann das ViewModel über die ExecuteAction()-Methode die entsprechende Methode auf dem Command aufrufen, welche daraufhin an die DataForm weitergeleitet wird. ExcuteAction() nimmt den Typ der Methode in Form eines Wertes der DataFormAction-Enumeration entgegen. Die folgenden Werte stehen hierbei zu Verfügung:
  • AcceptChanges: Übernimmt die über die Oberfläche durchgeführten Änderungen.
  • DetachDataSource: Entfernt die Datenquelle und die zugehörigen UI-Elemente aus dem Control.
  • Reset: Erstellt die Oberfläche anhand Datenquelle neu.
  • SetBusy: Sperrt die Oberfläche und blendet den BusyIndicator ein.
  • SetAvailable: Blendet den BusyIndicator aus und entsperrt die Oberfläche.
Das folgende Beispiel demonstriert die Anwendung:

View:
<dataform:DataForm
  ActionCommand="{Binding ActionCommand}" />


ViewModel:

public ActionCommand ActionCommand { get; set; }

private void SaveChanges()
{
  this.ActionCommand.ExecuteAction(
    DataFormAction.AcceptChanges, null);
  this.ActionCommand.ExecuteAction(
    DataFormAction.SetBusy, null);
  …
}


Der Wert DataFormAction.SetBusy bewirkt hierbei, dass alle Eingabefelder deaktiviert werden und der eingebaute BusyIndicator eingeblendet wird.

BusyIndicator

Der Wert DataFormAction.SetAvailable beendet die Animation wieder.

Zusätzlich bietet TT.DataForm die folgenden Eigenschaften, mit denen das Verhalten der Oberfläche konfiguriert werden kann.

Eigenschaft Beschreibung
AllowAddNew Bestimmt, die Neuanlage eines Datensatzes über das Steuerelement möglich sein soll.
AllowRemove Bestimmt, das Entfernen eines Datensatzes über das Steuerelement möglich sein soll.
IsReadOnly Bestimmt, ob das Steuerelement schreibgeschützt dargestellt werden soll.
Error Liefert den aktuellen Eigabefehler oder einen Leerstring zurück.
HasError Ruft ab, ob der aktuelle Datensatz Eingabefehler enthält.
IsBusy Legt fest, ob der Busy Indicator angezeigt werden soll.
BusyIndicatorType Legt den Typ des Busy Indicators fest. Zur Auswahl stehen Wheel, Dots und Custom. Bei letzterem Wert muss über die Eigenschaft BusyIndicatorTemplate ein benutzerdefiniertes Template bereitgestellt werden.

Das Beispielprojekt, das in den Sourcen von TT.DataForm enthalten ist, zeigt die Verwendung der verschiedenen Mechanismen in einem MVVM-Szenario.

Labels: