Databinding in Forms
Die Daten in Forms werden mithilfe von Databinding aus den zugeordneten Objekten gezogen.
Die Verarbeitung der Daten im Laufe eines Requests erfolgt immer in 3 Schritten:
- Der Client sendet einen Request mit Daten, die der Benutzer geändert hat. Das Binding spielt alle Änderungen in die momentan gebundenen Objekt-Instanzen ein.
- Das Form-Event / Workflow-Event wird ausgeführt. Änderungen an Objekten werden über diverse Events (wie z.B. PropertyChanged) gemeldet. Das Binding registriert diese Events - holt aber noch keine Daten ab.
- Nach der Event-Verarbeitung, am Ende vom Request aktualisiert das Binding die Daten. Alle zuvor registrierten Änderungen werden abgearbeitet, die Daten abgeholt und an die Controls übertragen. Die Änderungen werden mit dem Response zum Client geschickt.
Das Binding greift auf jedes Property maximal einmal zu. Das gilt auch dann, wenn sich während des Requests ein Property mehrfach ändert und mehrfach Changed-Events gefeuert werden.
Hierarchische Objekt-Strukturen werden vom Binding hierarchisch verarbeitet. Sie werden intern mit "Binding-Points" organisiert.
Änderungs-Markierungen werden an jedem einzelnen Binding-Point gesammelt.
Beispiel für Binding-Points:
- FormProperty:
oSalesOrder
- Propery:
oMaster
- Property:
lngOrderID
<--> ControledtOrderID.Value
- Property:
sOrderType
<--> ControlcmdOrdertype.Value
- Property:
- Propery:
Szenarien:
Wenn sich z.B.
lngOrderID
ändert, dann gibt es ein PropertyChanged-Event und nur der entsprechende Binding-Point wird markiert. Am Ende des Requests wird dann auch nur dieser eine Binding-Point aktualisiert. Alle anderen Properties werden nicht geprüft.Wurde eine Änderung von
oMaster
gemeldet, holt das Binding zuerst den neuen Wert vonoSalesOrder.oMaster
ab. Nur wenn dabei eine andere Objekt-Instanz zurückgegeben wird, dann werden auch die darunterliegendenden Binding-Points fürlngOrderID
undsOrderType
aktualisiert.
Individual Properties und DependsOn
Das Binding ist auf ein PropertyChanged-Event angewiesen, um Änderungen mitzubekommen. Individual Properties und Relations geben in der Regel berechnete Werte zurück, die von anderen Werten abhängen. Da sie keinen eigenen Wert besitzen, der ein PropertyChanged-Event auslösen könnte, sind sie darauf angewiesen, dass sie von ihren Abhängigkeiten benachrichtigt werden. Diese Aufgabe übernehmen die DependsOn-Properties.
Ist kein DependsOn hinterlegt, gibt es keine aktive Benachrichtigung und das Databinding geht davon aus, dass sich der Wert jederzeit ändern könnte. Aus diesem Grund werden diese Binding-Points nach jedem Request überprüft.
Dies sorgt für eine schlechte Performance und sollte, wenn möglich vermieden werden.
Generell sollten folgende Hinweise beachtet werden, insbesondere jedoch dann, wenn keine (sinnvollen) DependsOn-Angaben möglich sind.
- Die Get-Methode muss sehr performant sein und darf nicht bei jedem Zugriff einen Datenbank-Load absetzen.
- Es müssen dieselben Objekt-Instanzen zurückgegeben werden, wenn sich die Bedingungen nicht geändert haben. Das unterbindet eine Aktualisierung der darunterliegenden Binding-Points.