Erweiterte Programmierung


In diesem Kapitel lernen Sie alles rund um die Programmierung der Oberfläche in iPlus. Dafür werden folgende Themen und Fragen behandelt:

  1. Wie funktioniert der Designer und welche Werkzeuge gibt es?
  2. Welches sind die wichtigsten Steuerelemente für die Präsentation von Designs?
  3. Wie funktioniert das Databinding?
  4. Wie konvertiert man Daten zur Präsentation?
  5. Arbeiten mit Styles und Setter.
  6. Dynamisierung mittels unterschiedlichen Triggervarianten.
  7. Reagieren auf Ereignisse und Benutzerkationen.
  8. Zugriff auf UI-Resourcen die in der Datenbank gespeichert sind.

Die Benutzeroberfläche erstellen Sie mit dem Oberflächen-Designer. Sie haben die Wahl, ob Sie die Oberfläche mit den grafischen Werkzeugen erstellen oder mit dem XAML-Editor. Änderungen im grafischen Editor werden beim Umschalten in den XAML-Editor synchronisiert und umgekehrt.

Das Werkzeugfenster, mit dem Sie die Oberfläche grafisch editieren, ist in fünf Abschnitte untergliedert:

 

Zeichenwerkzeuge (A)

Mit den Zeichenwerkzeugen erstellen Sie Shapes. Nach der Selektion eines Zeichenwerkzeuges können Sie auf der Zeichenfläche die Formen zeichnen wie bei anderen Grafikprogrammen auch.

 

UI-Objektbaum (B)

Welche Objekte bzw. Klassen im UI-Objektbaum angezeigt werden hängt immer vom Kontext ab.
Wird der Designer in der Entwicklungsumgebung verwendet, dann ist der Datenkontext immer die Klasse, die im Klassenbaum der Entwicklungsumgebung selektiert wurde (siehe Klassenbäume und Projekte). Im UI-Objektbaum ist die Wurzel somit immer die selektierte Klasse (Datenkontext). Ihre Kind-Klassen werden unterhalb als Baumstruktur angezeigt.

Wird der Designer, während der Laufzeit für das aktuell angezeigte Businessobjekt geöffnet, dann ist der Datenkontext die Klasse des Businessobjektes selbst. Im UI-Objektbaum ist die Wurzel, die Klasse des Businessobjektes. Es macht daher keinen Unterschied, ob Sie in der Entwicklungsumgebung zu der Businessobjektklasse im iPlus-Projekt gehen und das Design dort editieren, weil die Wurzel im UI-Objektbaum dieselbe ist.

Das Businessobjekt zur Visualisierung bildet eine Ausnahme: Dort ist der Datenkontext die gesamte Anwendung. Daher werden im UI-Objektbaum alle Anwendungsprojekte als Wurzelobjekte angezeigt.

Ziehen Sie per "Drag & Drop" eine Klasse aus dem UI-Objektbaum auf die Zeichenfläche. Es wird mit dem standardmäßig mit dem Design präsentiert, das der Kategorie "Control" zugeordnet wurde und bei dem das Häkchen "Standard-Design" gesetzt wurde. Kurde kein Häkchen gesetzt, wird das erste genommen, das den niedrigsten Sortierindex besitzt.

 

Eigenschaftsliste (C)

In dieser Liste werden die Eigenschaften der im UI-Objektbaum selektierten Klasse angezeigt. Komplexe Eigenschaften, die wiederum Eigenschaften besitzen, weil sie ein Referenztyp sind, werden ebenfalls als Baumstruktur dargestellt. Dies ist besonders bei Eintity-Objekten der Fall. Beispiel: Eine Stücklistenposition verweist auf ein Material. Das Material wiederum auf eine Einheit. Die Einheit besitzt einen Namen. Der Pfad zum Namen wäre also "CurrentBOMLine.Material.Unit.Name". 

Ziehen Sie per "Drag & Drop" eine Eigenschaft auf die Zeichenfläche, dann wird ein passendes Steuerelement erstellt und die Adressierung (Bindungs-Pfad) automatisch gesetzt. Soll standardmäßig ein anderes Steuerelement verwendet werden, können Sie dies in der Entwicklungsumgebung in der Registerkarte "Eigenschaften" im Feld "Steuerelement" einstellen.

 

Methodenliste (D)

In dieser Liste werden die Methoden der im UI-Objektbaum selektierten Klasse angezeigt. 

Ziehen Sie per "Drag & Drop" eine Methode auf die Zeichenfläche, dann wird ein passendes Steuerelement erstellt (Button) und die Adressierung (ACUrlCommand zum Methodenaufruf) automatisch gesetzt. Soll anstatt eines Buttons standardmäßig ein anderes Steuerelement verwendet werden, können Sie dies in der Entwicklungsumgebung in der Registerkarte "Methode" im Feld "Steuerelement" einstellen.

 

Liste mit Texten und Meldungen (E)

In dieser Liste werden Texte und Meldungen der im UI-Objektbaum selektierten Klasse angezeigt. 

Ziehen Sie per "Drag & Drop" einen Text auf die Zeichenfläche, dann wird ein passendes Steuerelement erstellt, das den Text in der Sprache des angemeldeten Benutzers anzeigen kann.

 

Steuerelemente und Zeichnungen

Der UI-Objektbaum enthält noch zwei weitere Wurzel-Elemente:

 

Wechseln Sie in den XAML-Editor und schauen nach welcher Code generiert worden ist:

 

  1. Es wurde ein Rectangle deklariert, das eine Ableitung von Shape ist.
  2. Es wurde ein gip.core.layoutengine.VBVisual deklariert. VBVisual ist ein Steuerelement, das Designs einer Klasse anzeigt, die der Kategorie "Control" zugeordnet sind. Mehr dazu im nächsten Abschnitt.
  3. Es wurde eine gip.core.layoutengine.VBTextBox deklariert. 
  4. Es wurde ein gip.core.layoutengine.VBButton deklariert. 
  5. Es wurde ein gip.core.layoutengine.VBTranslationText deklariert.

Alle Steuerelemente aus dem gip.core.layoutengine-Namespace haben gemeinsam, dass Sie die Eigenschaft "VBContent" besitzen, die im Interface gip.core.datamodel.IACInteractiveObject deklariert ist. Wozu VBContent dient, wird im nachfolgenden Abschnitt näher erläutert.

 


Für Designs können Sie

verwenden.

Damit der XAML-Parser die Steuerelemente instanziieren kann, muss im Wurzel-Element das Namespace-Mapping mittels xmlns-Attribut angegeben werden. Lesen Sie mehr dazu im Kapitel "UI Bibliotheken einbinden".

Damit Steuerelemente im Werkzeugfenster des Designers erscheinen muss das Steuerelement mit der ACClassInfo-Attributklasse bekannt gegeben werden und der Kategorie "TACVBControl" zugeordnet werden:

 [ACClassInfo(Const.PackName_VarioSystem, "en{'VBBorder'}de{'VBBorder'}", Global.ACKinds.TACVBControl, Global.ACStorableTypes.Required, true, false)]
public class VBBorder : Border
{
}

Im Werkzeugfenster sehen Sie daher überwiegend Steuerelemente aus der iPlus-Bibliothek gip.core.layoutengine.dll, die mit dem Präfix "VB" beginnen. Falls es um Ableitungen von Steuerelementen aus dem .NET-Framework handelt, dann lauten die Endungen so wie die Basisklasse aus .NET. z.B. VBTextBlock, VBTextBox, VBComboBox...

 

Ziehen Sie per "Drag & Drop" ein Steuerelement auf die Zeichenfläche. Wechseln Sie anschließend in  den XAML-Editor. Es wurde folgender Code generiert:

 

Warum sollten Sie Steuerelemente aus iPlus verwenden?

  1. iPlus-Steuerelemente sind sogenannte "Custom Controls", deren Look-And-Feel mittels ControlTemplates dem iPlus-System angepasst sind. 
  2. iPlus-Steuerelemente sind in das User-Gruppen-Berechtigungssystem integriert. Entsprechend der eingestellten Rechte ändert sich das Nutzungsverhalten und Präsentation des Steuerelementes (Lesen, Ändern..). Zudem kann in der gebundenen ACComponent Einfluss auf die Nutzungsrechte des Steuerelements genommen werden.
  3. Beschriftungen von Datenfelder entsprechend der Spracheinstellung des angemeldeten Benutzers.
  4. Implizites Binding per VBContent-Eigenschaft. Der Anwender muss weniger Wissen über die verschiedensten Dependency-Properties aller Steuerelemente haben (z.B. Text, Content, IsChecked, SelectedDate, SelectedItem, ItemsSource, CommandBindings, ...) und wie er das Databinding bewerkstelligt.
  5. Implizite Kontextmenüfunktionen
  6. Navigation von gebundenen Entity-Objekten zu dem verantwortlichen Businessobjekt.
  7. Automatische Instanziierung, Anmeldung und Abmeldung von Proxy-ACComponents.
  8. Automatisches Binding zu netzwerkfähigen Eigenschaften.

 


Die meisten iPlus WPF-Steuerelemente aus "gip.core.layoutengine" implementieren diese Schnittstellen wegen der zuvor genannten Vorteile (IVBContent ist eine Ableitung von IACInteractiveObject).

"string IACInteractiveObject.VBContent" ist dabei wichtigste Eigenschaft. VBContent enthält in der Regel eine ACUrl, die relativ oder absolut auf eine ACComponent-Instanz, Eigenschaft oder Untereigenschafte eines komplexen Typs zeigt; Vergleichbar mit einem PropertyPath das auf ein Entity-Objekt zeigt. Im Gegensatz zu Property-Paths, die mit Punkten getrennt werden, wird eine ACUrl mit Backslash getrennt. Steuerelemente die IACInteractiveObject implementieren lösen beim erstmaligen Laden (Loaded-Event) diese ACUrl auf, indem Sie die Methode "gip.core.datamodel.IACObject.ACUrlBinding()" auf dem Objekt aufrufen auf das die Eigenschaft IACInteractiveObject.ContextACObject zeigt. In der Regel handelt es sich dabei um den gekapselten Datenkontext "FrameworkElement.DataContext", der nach IACObject gecastet wird. Das Resultat von ACUrlBinding ist eine Source- und Path-Variable, die verwendet werden, um ein Binding zu instanziieren und "Binding.Source" und "Binding.Path" automatisch zu setzen. Das Binding wird dann Steuerelementabhängig auf die passende Dependency-Property per "SetBinding()" angewendet.

Bei einer VBTextBox wäre das z.B. die Text-Eigenschaft. Bei einem VBDatePicker wäre das z.B. die SelectedDate-Eigenschaft.

 

Im Screenshot des XAML-Editors aus dem vorigen Abschnitt finden Sie VBVisual-Elemente. VBVisual ist ein ContentControl, das ebenfalls IVBContent implementiert. Im Gegensatz zu den vorher erwähnten Steuerelementen, deren VBContent eine Eigenschaft adressiert, adressiert die VBContent des VBVisuals eine ACComponent-Instanz aus dem Anwendungsbaum, welche wiederum per Databinding als Datenkontext gesetzt wird. Nachdem der Datenkontext gesetzt wurde, wird das Design der entsprechenden Klasse anzeigt, die der Kategorie "Control" zugeordnet und in der Entwicklungsumgebung als "Standarddesign" gekennzeichnet wurde. Das geladene Design enthält wiederum iPlus-Steuerelemente deren relativ angegebener nun wieder per VBContent gebunden werden kann, weil das VBVisual den richtigen Datenkontext bereits gesetzt hat.

Da für eine Klasse mehrere Designs der Kategorie "Control" angelegt werden können und nur eines davon das "Standarddesign" sein kann, können Sie mittels der Eigenschaft "VBDesignName" den ACIdentifier eines anderen Designs angeben, das stattdessen geladen werden soll.


VBDesign ist ein ContentControl, das ebenfalls wie VBVisual IVBContent implementiert.

VBDesigns dienen zum Laden und Anzeigen von Designs der Kategorie Hauptansicht (DUMain) und Teilansicht (DULayout). Hauptansichten und Teilansichten werden für Businessobjekte benötigt. Wenn ein Businessobjekt gestartet wird, dann wird vom iPlus-Framework zuerst ein Wurzel-VBDesign generiert und danach die Hauptansicht vom XAML-Parser geladen. Die Hauptansicht wird anschließend der Content-Eigenschaft des Wurzel-VBDesigns zugewiesen und der Datenkontext mit dem neuen Businessobjekt gesetzt. Zuletzt wird dann das Wurzel-VBDesign in den Logical-Tree eingehängt, damit es visuell sichtbar wird.

Entsprechend dem Schachtelungsprinzip von Designs, ist es nicht sinnvoll das gesamte Layout (XAML-Code) in eine Hauptansicht zu packen. Stattdessen sollten Hauptansichten weitere Teilansichten (Unterdesigns) laden, indem im XAML-Code "<VBDesign>"-Elemente deklariert und in der VBContent-Property der Name (ACIdentifier) des Unterdesigns mit einem vorangestellten Asterisk "*" angegeben wird:

e.g. <Grid>... 
<vb:VBDesign VBContent="*MyNameOfSubdesign"/>
...</Grid>

Wird kein Asterisk vorangestellt, dann wird der VBContent als ACUrl interpretiert und es erfolgt eine Auflösung des Pfades für ein Databinding. Die Eigenschaft im Businessobjekt, die gebunden werden soll, sollte vom Typ ACClassDesign sein. Somit kann das Businessobjekt per PropertyChanged-Event das VBDesign benachrichtigen, dass ein anderes Design geladen werden soll, das vom Businessobjekt selbst bereitgestellt wird. Mit dieser Technik können Sie z.b. einen Layoutwechsel zur Laufzeit im Stile eines Wizards umsetzen.

Wenn Sie VBDesigns im XAML-Code von Teilansichten platzieren, laden Sie wiederum weitere Teilansichten. Achten Sie darauf, dass eine Teilansicht sich nicht selbst erneut lädt. Eine Rekursionsüberprüfung gibt es nicht. Stattdessen wird eine StackOverflow-Exception vom .NET-Framework geworfen.

Beim Laden von Teilansichten wird der Datenkontext nicht geändert, sondern er wird über den Logical-Tree vom Wurzel-VBDesign geerbt. Den Datenkontext ändern Sie selbst, indem Sie ein Binding zu einer anderen Eigenschaft deklarieren.

 

Untergeordnete Geschäftsobjekte

Entsprechend des Kompositionsmusters, können Businessobjekte wieder Kind-Businessobjekte besitzen. Businessobjekte werden normalerweise Just-In-Time geladen, wenn sie benötigt werden. Ein Kind-Businessobjekt kann auch per VBDesign instanziiert und als Unteransicht ("Plugin") in das Design des Eltern-Businessobjekt integriert werden. Dies erreichen Sie mit dem <VBInstanceInfo>-Element:

...
<vb:VBDesign VBContent="*Mainlayout">
<vb:VBInstanceInfo Key="BSOAlarmMessengerConfig_Child"
ACIdentifier="BSOAlarmMessengerConfig_Child"
SetAsDataContext="True"
SetAsBSOACComponet="True"
AutoStart="True">
</vb:VBInstanceInfo>
</vb:VBDesign
...

Innerhalb eines VBDesigns, können mehrere VBInstanceInfo's deklariert werden. 

In der Eigenschaft ACIdentifier geben Sie den Namen des Kind-Businessobjektes an, das Sie zuvor in der Entwicklungsumgebung im Klassenbaum hinzugefügt haben. Im Feld Key geben Sie am besten denselben Namen an (Er dient zu eindeutigen Identifizierung der IntanceInfo-Instanz im Logical-Tree). Wird die Eigenschaft SetAsDataContext auf True gesetzt, dann wird der Datenkontext des VBDesigns mit dem Kind-Businessobjekt gesetzt. Die AutoStart-Eigenschaft gibt an, ob das Kind-Businessobjekt zur Laufzeit instanziiert werden soll, falls es noch nicht vorhanden ist.

Wichtig: Mit dem Ändern des Datenkontextes per SetAsDataContext, ändern Sie auch den Kontext zur Suche des Designs, das in der VBContent-Eigenschaft angegeben ist. Im obigen Beispiel wird das Design "Mainlayout" vom Kind-Businessobjekt gesucht und nicht das vom Eltern-BSO in dem der obige XAML-Code deklariert ist.

 

Besonderheit: BSOACComponent

Wenn Sie gut aufgepasst haben, werden Sie sich gefragt haben, wie kann eigentlich die relative Adressierung des Kind-Businessobjektes in VBInstanceInfo funktionieren, wenn es möglich ist, den Datenkontext durch ein Binding im Design des Eltern-Businessobjekts zu verändern?

Sie haben recht, dies funktioniert auch nicht und deswegen ist in der Basisklasse VBDesignBase des VBDesign's die Eigenschaft BSOACComponent deklariert:

public static readonly DependencyProperty BSOACComponentProperty = 
ContentPropertyHandler.BSOACComponentProperty.AddOwner(
typeof(VBDesignBase),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.Inherits,
new PropertyChangedCallback(OnDepPropChanged))
);

Diese Eigenschaft ist wie auch die FrameworkElement.DataContext-Property vererbbar im Logical-Tree. Beim Laden vom Root-VBDesign wird diese Eigenschaft ebenfalls gesetzt und darüber können dann Kind-Businessobjekte relativ adressiert werden - auch bei Verlust des Datenkontextes. Aus diesem Grunde sollten Sie auch im VBInstanceInfo-Element die Eigenschaft "SetAsBSOACComponent" auf True setzen wie Sie es im obigen Beispiel sehen können. 

 

VBDynamic

VBDynamic ist ein ContentControl, das IVBContent implementiert. Die VBContent-Eigenschaft sollte auf eine Eigenschaft verweisen, die vom Typ string ist und XAML-Code bereitstellt. Bitte vermeiden Sie möglichst XAML-Code im Programmcode zu hinterlegen. Der XAML-Code sollte möglichst aus der Datenbank oder einer anderen Datenquelle geladen werden. VBDynamic ist dann vorteilhaft, wenn Layouts per Programmlogik generiert oder Templates manipuliert werden. Beispielweise für Graphen oder ähnliches.

<vb:VBDynamic VBContent="XAMLLayoutProperty" 
DataContextForContent="{vb:VBBinding VBContent=SelectedFunction}" />

 

VBDynamicContent

VBDynamicContent ist ein ContentControl, das IVBContent implementiert. Es dient dazu den Wert einer per VBContent gebundenen Eigenschaft mit einem passenden Design zu präsentieren. Es ist vergleichbar mit dem Konzept von Datatemplates und DataTemplateSelector in ".NET".

VBDynamicContent analysiert dabei zuerst den .NET-Typen der Eigenschaft. Anhand des .NET-Typen sucht es den entsprechenden iPlus-Typ (ACClass). Wenn die ACClass gefunden wurde, wird das Standarddesign der Kategorie "Steuerelement" (DUControl) gesucht. Das Standarddesign wird vom XAML-Parser geladen und dem Content zugewiesen. Der Datenkontext wird mit dem Wert der gebundenen Eigenschaft gesetzt.

Mit dieser Technik können Sie jeglichen Typ, den Sie per ACClassInfo-Attribuklasse der iPlus-Runtime bekannt gegeben haben, dynamisch anzeigen lassen.

<vb:VBDynamicContent VBContent="CurrentParameterValue" />

 


Zur Anzeige von Datensammlungen benötigt man sogenannte ItemsControls. Datensammlungen werden dann an die ItemsSource-Eigenschaft gebunden, damit das ItemsControl die Daten auflisten kann.

iPlus Steuerelemente, die auf ItemsControls basieren implementieren das Interface gip.core.datamodel.IVBSource. In IVBSource ist die Eigenschaft VBSource definiert. VBSource ist vergleichbar mit der VBContent-Eigenschaft. Die dort angegebene ACUrl muss auf eine Datensammlung verweisen, die mittels der Methode "IACObject.ACUrlBinding()" aufgelöst wird, damit ein Binding generiert werden kann, das der ItemsSource-Eigenschaft zugewiesen wird.

Im Beispielprojekt wurden im Businessobjekt BSOInOrder die zwei Eigenschaften "SelectedInOrderPos" und "InOrderPosList" deklariert:

 

Um die "InOrderPosList" in einem Datagrid anzuzeigen, verwenden Sie bitte das iPlus-Steuerelement VBDataGrid, das IVBSource implementiert.

  1. Geben Sie dann in der VBSource-Property "InOrderPosList" an, damit ein automatisches Binding zur ItemsSource-Property im Hintergrund erstellt werden kann.
  2. In der VBContent-Property geben Sie "SelectedInOrderPos" an, damit ein automatisches Binding zur SelectedItem-Property im Hintergrund erstellt werden kann. 

 

 

Die VBSource-Eigenschaft muss nicht unbedingt gesetzt werden. Es reicht aus, dass Sie nur VBContent angeben. iPlus-Steuerelemente, die IVBSource implementieren, können die Datensammlung automatisch, mithilfe von zwei unterschiedlichen Techniken ermitteln:

 

ACPropertySelected und ACPropertyList

ACPropertySelected und ACPropertyList sind Attributklassen, die vor Eigenschaften deklariert werden, damit sie dem iPlus-Framework bekannt sind. Im obigen Sourcecode ist bei den beiden Attributklassen der zweite Parameter "string acGroup" gleich (Wert "InOrderPos.ClassName"). Damit wurde festgelegt, dass die beiden Eigenschaften semantisch zusammengehören und die Datenquelle kann dann automatisch ermittelt werden, wenn die "Selected-Eigenschaft" gefunden wurde.

 

Verweis auf Datenquelle in ACProperty-Attributklassen

Eine andere Variante ist die Verwendung des Parameters "string acSource" in den verschiedenen ACProperty-Attributklassen. Die wichtigste davon ist die ACPropertyEntity-Attributklasse, um Eigenschaften von EntityFramework-Klassen dem iPlus-Framework bekannt zu geben. Für Navigationseigenschaften (Fremdschlüssel) kann dann im acSource-Parameter eine ACUrl angegeben werden, die vom iPlus-Framework während der Laufzeit aufgelöst und als Datenquelle an das ItemsControl gebunden wird. 

Beispiel:

[ACPropertyEntity(2, Material.ClassName, "en{'Material'}de{'Material'}", 
Const.ContextDatabase + "\\" + Material.ClassName, "", true)]

Die gelb hervorgehobene ACUrl adressiert die Eigenschaft  "public ObjectSet<Material> Material" in der Entity-Framework Kontextklasse MyCompanyEntities aus dem Beispielprojekt. Diese ACPropertyEntity-Deklaration wurde in der partiellen Klasse InOrderPos gemacht. Damit wird beschrieben, dass für die Navigationseigenschaft "Material" (Fremdschlüssel "Guid MaterialID") in der Tabelle InOrderPos (Bestellposition) die Datenquelle in "MyCompanyEntities.Material" zu finden ist.

Im XAML-Code reicht dann folgende Deklaration ohne die Angabe von VBSource:

<vb:VBComboBox VBContent="SelectedInOrderPos\Material" />

VBComboBox ist ein weiteres iPlus-Steuerelement das IVBSource implementiert. Die ComboBox erstellt ein automatisches Binding zu seiner ItemsSource-Property indem es "ObjectSet<Material> MyCompanyEntities.Material" als Datenquelle bindet. Wenn die ComboBox geöffnet wird, dann erfolgt eine automatische Abfrage zur Datenbank indem es die Material-Tabelle abfrägt. Das in der Combobox ausgewählte Material wird dann automatisch der "InOrderPos.Material"-Eigenschaft zugewiesen, weil im Hintergrund die SelectedItem-Eigenschaft durch die VBContent-Angabe gebunden wurde.

Tatsächlich findet kein direkter Zugriff auf "ObjectSet<Material> MyCompanyEntities.Material" statt, sondern es wird die Datenbankabfrageklasse ACAccess<Material> dazwischengeschaltet, damit mit der F3-Taste der Abfragedialog geöffnet werden kann, um die Suche in der Material-Tabelle eingrenzen zu können. Der Abfragedialog benötigt eine zum Typ Material passende "speicherbare Abfrage", die mittels ACQueryInfoPrimary in der partiellen Material-Klasse dem iPlus-Typsystem bekannt gegeben worden ist.

 

VBContent und VBSource vereinfachen die Nutzung von iPlus-Steuerelementen deutlich. Jedoch gibt es zahlreiche andere Dependency-Properties die man per Databinding nutzen möchte. Oder Sie verwenden andere Third-Party-Steuerelemente, die sie nicht selbst mit IVBContent und IVBSource erweitern möchten. In diesen Fällen wäre es trotzdem nützlich die Bindungsquelle per ACUrl-Adressierung angeben zu können.

Dafür stellt Ihnen das iPlus-Framework die Klasse "gip.core.layoutengine.VBBinding" zur Verfügung, die eine Ableitung von "System.Windows.Data.Binding" ist. VBBinding besitzt die Eigenschaft VBContent, der Sie einen ACUrl-String zuweisen können.

Der ACUrl-String kann relativ zum aktuellen Datenkontext angegeben werden kann:

<vbv:VBMotor Width="20" Height="20" vbv:RunState="{vb:VBBinding vb:VBContent=RunState}" />

In diesem Beispiel wird das Design per VBVisual geladen und der Datenkontext mit einer ACComponent gesetzt, die die netzwerkfähige Eigenschaft RunState besitzt. Der ACUrl-String in VBContent ist deswegen relativ angegeben.

 

Falls Sie den ACUrl-String relativ zu BSOACComponent angeben möchten, setzen Sie die BindToBSO-Eigenschaft auf "true":

<vb:VBTextBox Text="{Binding Path=Gain}" 
ACCaptionTrans="{vb:VBBinding vb:BindToBSO=true, VBContent=\\Database\\ACProject(Variolibrary)\\ACClass(GIPControllerPIDData2006)\\ACClassProperty(Gain)\\ACCaption}" />

In diesem Beispiel wird die Text-Eigenschaft an die Bindungsquelle "Gain" gebunden die einem Objekt angehört, das der aktuelle Datenkontext ist. Die ACCaptionTrans-Eigenschaft wird an eine Datenbank-ACUrl gebunden. Damit diese aufgelöst werden kann, wird eine ACComponent bzw. IACObject benötigt bei der die Methode "ACUrlBinding()" aufgerufen werden kann. Da der aktuelle Datenkontext eine primitive Klasse ist, die nicht IACObject implementiert, ist BindToBSO auf true gesetzt, weil dann die ACUrlBinding-Methode von BSOACComponent aufgerufen werden soll um die Bindungsquelle auflösen zu können.

VBBinding können Sie also überall als Ersatz für das klassische .NET-Binding verwenden.