Programmgesteuertes Binden der erstellten Objekte
Nach oben zu Tutorial: Programmgesteuerte Verwendung von LiveBinding
- Achtung: Die hier beschriebene programmseitige Methode zum Implementieren von Bindungsausdrücken stellt NICHT das Standardverfahren dar. Normalerweise würden Sie beim Entwurf den Objektinspektor verwenden. Wahrscheinlich werden Sie die programmseitige Methode zum Erstellen von Bindungsausdrücken nie benötigen. In diesem Tutorial wird jedoch gezeigt, dass es möglich ist, solche Ausdrücke manuell zu erstellen.
- Beispiele für das Standardverfahren bei der Verwendung von LiveBindings finden Sie unter:
Nun müssen Sie für die Bindung einen Bindungsausdruck erstellen, der der LiveBinding-Engine mitteilt, wie Objekte aneinander gebunden und welche Operationen mit den gebundenen Eigenschaften ausgeführt werden sollen.
Das folgende Codefragment zeigt, wie die beiden Eingabeobjekte (MyObject1 und MyObject2) an das Ausgabeobjekt (MyResultObject) gebunden werden. Die Syntax ist etwas unhandlich und wird nach dem Codefragment erläutert.
Delphi:
var
BindingExpression1: TBindingExpression;
BindingExpression2: TBindingExpression;
begin
{ a binding expression that binds the two Integer properties of the given objects }
BindingExpression1 := TBindings.CreateManagedBinding(
{ inputs }
[TBindings.CreateAssociationScope([
Associate(MyObject1, 'o1'),
Associate(MyObject2, 'o2')
])],
'o1.IntegerValue + o2.IntegerValue',
{ outputs }
[TBindings.CreateAssociationScope([
Associate(MyResultObject, 'res')
])],
'res.IntegerValue',
nil);
{ a binding expression that binds the two String properties of the given objects }
BindingExpression2 := TBindings.CreateManagedBinding(
{ inputs }
[TBindings.CreateAssociationScope([
Associate(MyObject1, 'o1'),
Associate(MyObject2, 'o2')
])],
'o1.StringValue + o2.StringValue',
{ outputs }
[TBindings.CreateAssociationScope([
Associate(MyResultObject, 'res')
])],
'res.StringValue',
nil);
end;
C++:
TBindingExpression *BindingExpression1, *BindingExpression2;
OpenArray<_di_IScope>InputScopes
(TBindings::CreateAssociationScope
(OPENARRAY(TBindingAssociation, (Associate(MyObject1, "o1"),
Associate(MyObject2, "o2")))));
OpenArray<_di_IScope>OutputScopes
(TBindings::CreateAssociationScope
(OPENARRAY(TBindingAssociation, (Associate(MyResultObject,
"res")))));
BindingExpression1 = TBindings::CreateManagedBinding(InputScopes,
InputScopes.GetHigh(), "o1.IntegerValue + o2.IntegerValue",
OutputScopes, OutputScopes.GetHigh(), "res.IntegerValue", NULL);
BindingExpression2 = TBindings::CreateManagedBinding(InputScopes,
InputScopes.GetHigh(), "o1.StringValue + o2.StringValue",
OutputScopes, OutputScopes.GetHigh(), "res.StringValue", NULL);
Mit dieser Syntax wird ein verwalteter Bindungsausdruck erstellt. Weitere Information über verwaltete Bindungsausdrücke finden Sie in dem API-Referenzthema System.Bindings.Helper.TBindings.CreateManagedBinding. In diesem Codefragment wird mit einer zweiten überladenen Methode, CreateManagedBinding, ein verwalteter Bindungsausdruck erstellt.
Die Syntax für die beiden Bindungsausdrücke (die IntegerValue oder StringValue betreffen) ist gleich, daher wird nur die Syntax des ersten Bindungsausdrucks erläutert.
Das Array des Eingabegültigkeitsbereichs (RealObject, ScriptObject) wird folgendermaßen angegeben:
Delphi:
[TBindings.CreateAssociationScope([
Associate(MyObject1, 'o1'),
Associate(MyObject2, 'o2')
])]
C++:
OpenArray<_di_IScope>InputScopes
(TBindings::CreateAssociationScope
(OPENARRAY(TBindingAssociation, (Associate(MyObject1, "o1"),
Associate(MyObject2, "o2")))));
Der Bindungsausdruck für den Eingabegültigkeitsbereich ist einfach eine Addition der beiden Integer-Eigenschaften des Objekts.
Delphi:
'o1.IntegerValue + o2.IntegerValue'
C++:
"o1.IntegerValue + o2.IntegerValue"
Wenn Sie sich die Syntax von BindingExpression1 näher ansehen, werden Sie feststellen, dass das Array der Ausgabe-Gültigkeitsbereiche und der Bindungsausdruck für den Ausgabe-Gültigkeitsbereich dieselben wie die oben beschriebenen sind, sich aber auf das Ergebnisobjekt (MyResultObject) auswirken.
Damit ein Bindungsausdruck ausgewertet und compiliert wird, muss ein Notify-Befehl ausgeführt werden. Wenn sich der durch eine Eigenschaft eines Objekts angegebene Wert ändert, müssen Sie die Bindungs-Engine darüber informieren. Dies wird folgendermaßen ausgeführt.
Delphi:
{ if the IntegerValue or StringValue for MyObject1 changes, use the following lines of code }
TBindings.Notify(MyObject1, 'IntegerValue');
TBindings.Notify(MyObject1, 'StringValue');
{ if the IntegerValue or StringValue for MyObject2 changes, use the following lines of code }
TBindings.Notify(MyObject2, 'IntegerValue');
TBindings.Notify(MyObject2, 'StringValue');
{ or any other combination of the two above, depending on which value changes }
C++:
// if the IntegerValue or StringValue for MyObject1 changes, use the following lines of code
TBindings::Notify(MyObject1, "IntegerValue");
TBindings::Notify(MyObject1, "StringValue");
// if the IntegerValue or StringValue for MyObject2 changes, use the following lines of code
TBindings::Notify(MyObject2, "IntegerValue");
TBindings::Notify(MyObject2, "StringValue");
// or any other combination of the two above, depending on which value changes