Übersicht

In der Dokumentfunktion ‘Dokument-Parameter’ kann die Eingabemaske konfiguriert werden, die beim Anwählen einer Vorlage erscheint. Die Konfiguration kann grob in drei Teile unterteilt werden: oben bei den ‘DataNodes’ werden die Nodes definiert, auf die in der ‘View’ im unteren Teil zugegriffen wird. In der View wird das Aussehen des Dokumentparameters festgelegt. Im DataSources-Part können Datenbank Abfragen definiert werden, und die Werte aus der Abfrage auf die unter DataNodes definierten CustomElements geschrieben werden.

Grundgerüst mit Verwendung von Views:

<!-- ↓ Dies ist der Root Node der Konfiguration -->
<Configuration>
  <!-- ↓ Zwingende Komponente, ohne DataNodes kann keine View aufgebaut werden	-->
  <CustomContentSection xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Dokument-Parameter" WindowWidth="750" WindowHeight="750">
    <DataNodes>
      <!-- CustomDataNodes werden hier Definiert -->
    </DataNodes>
  </CustomContentSection>
  <!-- ↓ Zwingende Komponente, ohne View gibt es keinen Dialog -->
  <Views>
    <View>
      <!-- Hier wird das Aussehen des Dialoges Definiert -->
    </View>
  </Views>
  <!-- ↓ Optionale Komponente -->
  <!--
  <DataSources>
    <SqlDataSource></SqlDataSource>
  </DataSources>
  -->
</Configuration>

Grundgerüst ohne Verwendung von Views:

<!-- ↓ Dies ist der Root Node der Konfiguration -->
<Configuration>
  <!-- ↓ Zwingende Komponente, ohne DataNodes kann keine View aufgebaut werden	-->
  <CustomContentSection xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Dokument-Parameter" WindowWidth="750" WindowHeight="750">
    <DataNodes>
      <!-- CustomDataNodes werden hier Definiert -->
    </DataNodes>
  </CustomContentSection>
  <!-- ↓ Optionale Komponente -->
  <!--
  <DataSources>
    <SqlDataSource></SqlDataSource>
  </DataSources>
  -->
</Configuration>

Am Ende dieser Seite befinden sich einige Beispiele, um die Verwendung der DataNodes mit und ohne Views zu veranschaulichen.

Attribute von CustomContentSection

Beispiel:

<CustomContentSection xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Dokument-Parameter" WindowWidth="750" WindowHeight="750">
Name Beschreibung
Name (Fenstername) Über das Attribut “Name” kann der Name des Dokument-Parameter-Dialog-Fensters definiert werden.
WindowWidth (Fensterbreite) Über das Attribut “WindowWidth” kann die Fensterbreite in Pixel definiert werden. 1200 Pixel sollten nicht überschritten werden, da unter dieser Auflösung die einwandfreie Darstellung von OneOffixx möglich sein sollte.
WindowHeight (Fensterhöhe) Über das Attribut “WindowHeight” kann die Fensterhöhe in Pixel definiert werden. 1200 Pixel sollten nicht überschritten werden, da unter dieser Auflösung die einwandfreie Darstellung von OneOffixx möglich sein sollte. Der Wert für WindowHeigth muss zwingend gesetzt sein. (Gilt für Verwendung mit und Ohne Views). Wenn der Inhalt die definierte WindowHeight überschreitet, wird automatisch eine Scrollleiste eingefügt.

Die DataNodes und deren Attribute

In diesem Abschnitt geht es um die Konfiguration zwischen <DataNodes> und </DataNodes>. Jedes CustomDataNode definiert ein Dokument-Parameter-Feld, auf das im Editor, in Skripts oder über Extended Bindings zugegriffen werden kann. Für jedes Feld in den Views (siehe Views) muss für die Weiterverwendung der Eingabe ein CustomDataNode angelegt werden.

Grundgerüst eines CustomDataNodes:

  <Elementname  Id="DocParam.Feldname"></Elementname>

Diese drei Attribute müssen unabhängig vom Typ auf jeden Fall vorhanden sein, ansonsten wird der DataNode nicht richtig funktionieren.

CustomDataNode-Basisattribute (gelten für Verwendung mit und ohne Views)

Name Beschreibung
Type (xsi:type) TextNode
Wird in Word zu einem Nur-Text-Inhaltssteuerelement (Plain Text Content Control), für ein- oder mehrzeilige Text-Eingabe, Überprüfung via Regex möglich

CheckBoxNode
Wird in Word zu einem Kontrollkästchensteuerelement (Check Box Content Control), für ja/nein-Auswahl

DateTimeNode
Wird in Word zu einem Datumsauswahl-Inhaltssteuerelement (Date Picker Content Control), für Datumsfeld mit Kalenderauswahl

ComboBoxNode
Wird in Word zu einem Kombinationsfeld-Inhaltssteuerelement (Combo Box Content Control), für die Auswahl zwischen vorgegebenen Werten (beliebige Eingaben in Word zulässig)

LabelNode
Überschrift im Dokument-Parameter-Dialog wenn Views nicht verwendet werden, nicht für die Verwendung im Editor, in Skripts und in Extended Bindings geeignet

RadioButton
Es gibt keinen RadioButton-Typ. Der Grund ist, dass es in Word keine RadioButton-Inhaltssteuerelemente gibt. Trotzdem benötigen RadioButtons ein CustomDataNode, damit die Auswahl in der View gespeichert werden kann für die Verwendung im Editor, in Skripts und in Extended Bindings.

Mögliche CustomDataNode-Typen für das Speichern der Auswahl von RadioButtons:

Als Textnode
In diesem Fall wird der Value des in der View ausgewählten RadioButtons im TextNode gespeichert. Dies ist für Dokument-Parameter geeignet, die nicht in Word eingefügt werden sondern nur für den Zugriff via Skript oder Extended Binding erstellt wurden. Falls ein RadioButton vorausgewählt sein soll muss der Value des entsprechenden RadioButtons als Standard-Text konfiguriert werden, also:
<Text Id="DocParam.RadioButtonGender">ValueDesEntsprechendenRadioButtons</Text>

Als ComboBoxNode
In diesem Fall wird der ComboBoxNode-Eintrag ausgewählt, bei dem der Key genau dem Value des RadioButtons entspricht. Dies ist auch für Dokument-Parameter geeignet, welche in Word eingefügt werden, da die Anzeige im Dokument über den Value des ComboBoxNode-Eintrags gesteuert wird. Falls ein RadioButton vorausgewählt sein soll muss der Value des entsprechenden RadioButtons im SelectedValue-Attribut der ComboBoxNode konfiguriert werden, also:
<ComboBox Id="DocParam.RadioButtonGender" SelectedValue="ValueDesEntsprechendenRadioButtons">...</ComboBox>

Wie die RadioButtons dann in der View definiert werden, wird im entsprechenden Kapitel beschrieben.

Ohne Views können keine RadioButtons definiert werden
Label (Beschriftung) Beschriftung des Elements im Quick Check-Panel, wenn es sich um einen Tracked-Dokument-Parameter handelt.
Required (benötigtes Feld) Attribut nur für Elemente des Typs Textfelder zulässig. Definiert ob das Feld leer gelassen werden kann (Required=”false” oder nicht gesetzt) oder ob das Feld ausgefüllt werden muss (Required=”true”). Wird von der Validierung (Regex-Attribut) übersteuert, falls eine gesetzt wird.
Regex (Validierung) Attribut nur für Elemente des Typs Textfelder zulässig. Erlaubt es einen Regex (.NET Syntax) zu definieren, welcher im eingegeben Text min. einen Match finden muss. Achtung: Falls der ganze Text ‘gematcht’ werden soll oder nur genau ein ‘Match’ vorhanden sein muss, muss dies vom Regex-Ausdruck definiert werden.

Beispiele
Regex=”[0-9]+” erzwingt, dass min. ein Zeichen des Eingabetexts eine Ziffer sein muss. “Hallo 205” ist so z. B. eine gültige Eingabe.

Regex=”^[0-9]+$” erzwingt, dass alle Zeichen des Eingabetexts Ziffern sein müssen (und dass min. 1 Ziffer vorhanden sein muss). (^ matcht den Anfang des Eingabetextes und $ das Ende)
Online Tool zum erstellen von Regex
ValidationMessage (Fehlermeldung) Attribut nur für Elemente des Typs Textfelder zulässig. Falls Required=”true” oder ein Validierungs-Regex gesetzt wurde, erlaubt ValidationMessage eine benutzerdefinierte Fehlermeldung anzuzeigen, falls die Validierung fehlschlägt. Falls ValidationMessage nicht gesetzt ist, wird im Fehlerfall eine Standardmeldung angezeigt.
Tracked (Überwachung mit “Quick Check”) Die OneOffixx-Funktion Quick Check (Inhaltssteuerelemente prüfen) wird mit dem Attribut Tracked aktiviert. Ist der Wert auf true gesetzt, wird dem Benutzer im separaten Panel das Feld angezeigt. Sofern der Inhalt des Elementes leer ist, wird das Feld im Panel rot und nach Bearbeitung grün angezeigt.
Id (Identifikation) Textuelle Id, welche eindeutig sein muss. Diese wird im Editormodus angezeigt und danach für die Verwendung im Editor, in Skripts oder in Extended Bindings benötigt. Die Id darf keine Leerzeichen enthalten.
Wenn eine Id Doppelt vorhanden ist (NICHT in der View, sondern in den CustomDataNodes), dann kann der Dokumente-Parameter-Dialog nicht geöffnet werden.
SelectedValue (Ausgewählter Eintrag) Attribut nur für Elemente des Typs Kombinationsfeld (ComboBoxNode) zulässig. Über diese Option wird bestimmt, welcher Eintrag in der Liste standardmässig selektiert werden soll.
IsChecked (Standard-Selektion) Attribut nur für Elemente des Typs Kontrollkästchen (CheckBoxNode) zulässig. Über diese Option wird bestimmt, ob die Checkbox standardmässig selektiert oder unselektiert sein soll.
Locked (Sperrung) Hat keine Wirkung. War ursprünglich dafür vorgesehen, dass das Inhaltssteuerelements (Content Control) in Word nicht gelöscht werden kann.
ReadOnly (nur Leserecht) Hat keine Wirkung. War ursprünglich dafür vorgesehen, dass das der Inhalt des Inhaltssteuerelements (Content Control) in Word nicht bearbeitet werden kann.
DateFormat Nur für Nodes des Typen “DateTimeNode”, definition des Datumsformates z. B. “dd MM yyyy” für “02.06.2016”. Liste mit Datumsformaten
IsNowDefault Nur für Nodes des Typen “DateTimeNode”, setzt das initiale Datum auf das aktuelle Tagesdatum.
Calendar Nur für Nodes des Typen “DateTimeNode”, setzt das format des Kalenders. Default ist “Gregor”, muss nicht gesetzt werden.

CustomDataNode-Zusatzattribute bei Nichtverwendung von Views

Name Beschreibung
Row (Zeile) Zeile, in welcher das Element im Dokument-Parameter-Dialog angezeigt werden soll.
Column (Spalte) Spalte, in welcher das Element im Dokument-Parameter-Dialog angezeigt werden soll (Startpunkt). Es sind mit der Label-Spalte 4 Spalten vorhanden.
ColumnSpan (Länge) Länge resp. Anzahl Spalten über welche sich das Element erstrecken soll.
Label (Beschriftung) Beschriftung des Elements im Dokument-Parameter-Dialog, gilt auch für Überschriften des Typs LabelNode. Sofern mehrere Elemente in einer Zeile dargestellt werden, wird die Beschriftung des ersten Elements übernommen. Die Beschriftung erscheint immer in der Spalte ganz links. Wenn Tracked auf true gesetzt ist fungiert das Label zusätzlich als Beschriftung des Elements im Quick Check-Panel.
Visible (Sichtbarkeit) Wenn die Sichtbarkeit auf false gesetzt ist, wird der Dokument-Parameter im Dialog nicht angezeigt.
Tooltip (Hinweis) Hinweis, welcher angezeigt wird, wenn der Benutzer mit der Maus darüber fährt. Wird von ValidationMessage überschrieben, falls diese gesetzt ist (bei Textfeldern).
IsInputEnabled (Beschriftung editierbar) Attribut nur für Elemente des Typs Kontrollkästchen (CheckBoxNode) zulässig. Wenn diese Option auf true gesetzt ist, werden im Dokument-Parameter-Dialog Kontrollkästchen angezeigt, bei welchen der User die Beschriftung editieren resp. frei wählen kann.
MultiLine (Mehrzeiligkeit) Attribut nur für Elemente des Typs Textfelder (TextNode) zulässig. Erstellt mehrzeilige Textfelder wenn auf true gesetzt.
MultilineRows (Anzahl angezeigter Zeilen bei Mehrzeiligkeit) Attribut nur für Elemente des Typs Textfelder (TextNode inkl. Multiline=”true”) zulässig. Definiert die Anzahl angezeigter Zeilen in mehrzeiligen Textfelder (standardmässig auf 3).
IsSearchEnabled (Suche für Kombinationsfelder aktivieren) Attribut nur für Elemente des Typs Kombinationsfeld (ComboBoxNode) zulässig. Über diese Option wird bestimmt ob Mittels Tastatureingabe im Kombinationsfeld nach vorhandenen Einträgen gesucht werden kann.
IsEditable (bei Kombinationsfeld beliebige Eingabe zulassen) Attribut nur für Elemente des Typs Kombinationsfeld (ComboBoxNode) zulässig. Über diese Option wird bestimmt, ob der Benutzer eine beliebige Eingabe tätigen kann. Wenn dieses Attribut nicht auf true gesetzt ist kann der Benutzer nur zwischen den vorhandenen Einträgen auswählen.

ComboBox / ComboBoxNode

ComboBoxNodes werden im Word-Editor als ComboBox Content Controls eingefügt. Der Benutzer kann dabei direkt in Word zwischen den verschiedenen ListItems auswählen.

Nachfolgend befindet sich je ein Beispiel für ComboBox-DataNodes im neuen und im alten Format.

Neuer ComboBox-DataNode:

<ComboBox Id="DocParam.ReasonForCongratulation" SelectedValue="employeeAnniversary">
  <Item Value="birthday" DisplayText="Geburtstag"  />
  <Item Value="employeeAnniversary" DisplayText="Mitarbeiterjubiläum"  />
  <Item Value="motherFatherhood" DisplayText="Mutter-/Vaterschaft"  />
</ComboBox>

Alter ComboBox-DataNode:

<CustomDataNode xsi:type="ComboBoxNode" Id="DocParam.OldComboBoxNode" SelectedValue="employeeAnniversary">
  <ListItems>
    <Item><Key><string>birthday</string></Key> <Value><string>Geburtstag</string></Value></Item>
    <Item><Key><string>employeeAnniversary</string></Key>  <Value><string>Mitarbeiterjubiläum</string></Value></Item>
    <Item><Key><string>motherFatherhood</string></Key>  <Value><string>Mutter-/Vaterschaft</string></Value></Item>
  </ListItems>
</CustomDataNode>

Wichtig: Der DisplayText (im alten ComboBox-DataNode der Value) darf nie leer sein, da Word leere DisplayTexts in ListItems nicht erlaubt. Es muss mindestens ein Zeichen (auch ein Leerzeichen ist möglich) im DisplayText enthalten sein.

Beim alten ComboBox-DataNode muss darauf geachtet werden, dass die folgenden beiden Zeilen aus XML-Sicht gleich sind:

<Value><string> </string></Value>
<Value><string></string></Value>

Das Leerzeichen wird ignoriert. Um zu erreichen, dass das Leerzeichen als DisplayText übernommen wird, muss ein CDATA-Tag eingefügt werden:

<Value><string><![CDATA[ ]]></string></Value>

ab 3.3.10380 Ab dieser Version können auch leere DisplayTexts konfiguriert werden. Diese werden von OneOffixx umgewandelt in ein Leerzeichen.

Views

Grundaufbau

  • Es können beliebig viele View Elemente erstellt werden.
  • In einer View können beliebig viele Row Elemente enthalten sein.
  • Eine View hat im Standardfall 4 Spalten (Columns). Mit dem Attribut Columns kann die Spaltenanzahl jedoch auch auf 1, 2, 3, 4, 6 oder 12 gesetzt werden.
<Views>
  <View Id="main" Label="Startseite">
    <Row>[...]</Row>
    <Row>[...]</Row>
    [...]
    <Button Type="Submit" Label="OK" />
    <Button Type="Cancel" Label="Abbrechen" />
  </View>
</Views>

Spezial-IDs:

  • View mit “main” ==> Start-Ansicht
  • Button Type=”Submit” ==> Dokument-Parameter-Dialog verlassen, weiter im Prozess
  • Button Type=”Cancel” ==> Dokument-Parameter-Dialog verlassen, Abbruch des Prozesses

Navigations-Controls

  • Buttons
<Button TargetView="Final" IsDefault="true" Label="Abschluss" />

TargetView = Id des Ziel-View
Label = Text des Buttons
IsDefault = “true”/”false” - Standard-Aktion bei Enter

Falls kein TargetView gefunden wird, sieht man nur eine weisse Fläche.

Struktur-Controls innerhalb von Rows

Name Beschreibung
TextBlock: Zum Darstellen von formatierten Text <TextBlock Style="h1" Alignment="left">Hello World!</TextBlock>
Style = “h1”/”h2”/”small”/”“
Alignment = “left” (default) /”right”/”center”/”justify”
Image: Bildanzeige <Image Height="50" Alignment="left">Base64Encoded-Image</Image>
Alignment = “left”/”right”/”center” (default)
Height = Pixelhöhe
Bilddaten können auch innerhalb eines CDATA Block stehen
Separator: Trennlinie <Separator />}
Label: Einfacher Text <Label Content="Eingabefeld" />
Content = Text des Labels

Wert-Controls innerhalb von Rows

Grundregel: Wenn es eine CustomDataNode mit derselben Id gibt, wird versucht dies als Datenquelle zu nutzen. Diese Controls besitzen alle ein “Value”-Attribut, welches als initialer Wert genutzt wird.

Name Beschreibung
TextBox: Einzeilige oder mehrzeilige Texteingabe <TextBox Value="Text" Id="DocParam.Subject" Lines="2" Mask="000.0000.0000.00" />
Value = Vordefiniert, wird aber ignoriert wenn es eine CustomDataNode mit der Id gibt.
Lines = Anzahl an Zeilen - Standard ist 1.
ab 3.2.1 Mask = Eingabe-Maske, erleichtert die Eingabe, z. B. für eine AHV-Nummer (Mask=”000.0000.0000.00”), für die Syntax und die Möglichkeiten siehe hier: Xceed WPF Toolkit, MaskedTextBox, Supported Masks
Validierung: Verbindet man das TextBox Control an eine CustomDataNode vom Typ Text werden die Validierungsoptionen von dort übernommen.
CheckBox: Auswahlkasten - oder halt CheckBox <CheckBox Id="DocParam.Erweitert" Label="Notizen" />
Label = Beschreibung, erscheint rechts von der CheckBox
ComboBox: Auswahlliste <ComboBox Value="0" IsInvalidWhenValue="0" Id="DocParam.Typ">
 <Item Label="Bitte wählen" Value="0" />
 <Item Label="Stufe 1" Value="1" /></ComboBox>
Die Werte für die ComboBox können entweder im CustomDataNode definiert werden, oder in der View. Die Liste der Werte wird aus dem CustomDataNode übernommen, auch wenn in der View eine Liste definiert wurde. Wenn die Liste in der View definiert wird, dann muss der CustomDataNode ein TextNode sein, damit die Liste aus der View verwendet werden kann. Beispiele dazu finden sie am Ende dieser Seite. Wenn der CustomDataNode ein ComboBoxNode ist, dann wird das Feld bei Verwendung im Word als Auswahlbox dargestellt, wenn der CustomDataNode ein TextNode ist und die Liste der Werte in der View definiert werden, so wird bei Verwendung des Feldes im Word nur der Text der ausgewählten Option als Text abgefüllt.

Value = Ausgewähltes Element (muss als Item beschrieben sein)
IsInvalidWhenValue = Wenn das ausgewählte Element diesen Wert hat, ist das Control nicht “valide”, d.h. man kann das Dokument nicht erzeugen
Item.Label = Text, welcher angezeigt wird
Item.Value = Wert, wenn ausgewählt
IsEditable = true/false - wenn true, kann selbst ein Text eingegeben werden
DatePicker: Datumsauswahl <DatePicker Id="DocParam.ErstellDatum" />
RadioButton: Gruppierter Auswahlknopf <RadioButton Id="DocParam.Level" Label="Stufe 1" Value="level1" />

Eine RadioButton Auswahl basiert auf einen CustomDataNode. Pro Anwählbarer Option muss ein einzelnes solches RadioButton Element definiert werden. Die Id Bleibt dabei gleich, nur Label und Value sind anders

Label = Beschreibungstext, welcher rechts des Knopfs erscheint
Value=Wert

Definition eines RedioButtons mit einem TextNode
In diesem Fall wird der Value des in der View ausgewählten RadioButtons im TextNode gespeichert. Dies ist für Dokument-Parameter geeignet, die nicht in Word eingefügt werden sondern nur für den Zugriff via Skript oder Extended Binding erstellt wurden. Falls ein RadioButton vorausgewählt sein soll muss der Value des entsprechenden RadioButtons als Standard-Text konfiguriert werden, also:

<Text Id="DocParam.RadioButtonGender">M</Text>

Definition eines RadioButtons mit einem ComboBoxNode
In diesem Fall wird der ComboBoxNode-Eintrag ausgewählt, bei dem der Key genau dem Value des RadioButtons entspricht. Dies ist auch für Dokument-Parameter geeignet, welche in Word eingefügt werden, da die Anzeige im Dokument über den Value des ComboBoxNode-Eintrags gesteuert wird. Falls ein RadioButton vorausgewählt sein soll muss der Value des entsprechenden RadioButtons im SelectedValue-Attribut der ComboBoxNode konfiguriert werden, also:

<ComboBox Id="DocParam.RadioButtonGender" SelectedValue="M">
 <Item Value="M" DisplayText="Männlich" />
 <Item Value="W" DisplayText="Weiblich" />
</ComboBox>

Die dazugehörige View Konfiguration der Radiobuttons (für beide Fälle) würde dann so aussehen:
<Row>
 <RadioButton Id="DocParam.RadioButtonGender" Value="M" Label="Männlich" />
 <RadioButton Id="DocParam.RadioButtonGender" Value="W" Label="Weiblich" />
</Row>

Die Wert und Struktur-Controls können alle noch mit folgenden Attributen erweitert werden:

Name Beschreibung
ColumnSpan Gibt an wieviele Spalten das Control beansprucht (Mindestens 1, Maximal 4)
ColumnOffset Gibt an wieviele Spalten vor dem Control übersprungen werden sollen (Sogesehen der Einzug)
IsEnabled Aktiviert / Deaktiviert (“true”/”false”, “1”/”0”)
IsVisible Sichtbar / Unsichtbar (“true”/”false”, “1”/”0”)
Tooltip Angezeigter Text wenn der Cursor über diesem Element ist

Bindings

Über “Bindings” können folgende Attribute gesteuert werden:

  • IsEnabled (gilt für alle Elemente)
  • IsVisible (gilt für alle Elemente und kann ebenfalls auf eine Row angewandt werden.)
  • Value (gilt für Elemente die ein “Wert” haben, TextBox/TextBlock - aber keine Buttons)
  • TargetView (gilt nur für Buttons)

Bindings beziehen sich damit auf andere Werte und können diese als “Wert-Grundlage” oder abfrage nutzen.

Bindings können nur bei Verwendung von Views eingefügt werden

IsEnabled/IsVisible Beispiel:

<Button Bind="IsVisible: $('DocParam.Erweitert') != 'true'" TargetView="Final" Label=">" />
<Button Bind="IsVisible: $('DocParam.Erweitert') == 'true'" TargetView="Notizen" Label="Notizen >" />

Button mit Label “Notizen >” wird nur angezeigt, wenn es einen Wert “DocParam.Erweitert” mit “true” gibt. IsEnabled funktioniert genauso.

TargetView Beispiel:

<Button Bind="TargetView: $('DocParam.Type')" />

Row Beispiel:

<Row Bind="IsVisible: $('DocParam.Erweitert') == 'true'">
  <TextBlock>Nur Sichtbar wenn DocParam.Erweitert gleich true ist</TextBlock>
</Row>

Vergleichsoperatoren der Bindings

Operator Beschreibung
!= ungleich, gilt für Text und Zahlen.
== gleich, gilt für Text und Zahlen
&gt; für > grösser als. (XML-Attribute erlauben keine < oder >, daher muss &lt; oder &gt; verwendet werden)
&gt;= für >= grösser oder gleich
&lt; für < kleiner als
&lt;= für <= kleiner oder gleich

Mehrere Bedingungen können mit UND oder ODER verknüpft werden.
|| für ODER
&amp;&amp; für UND (steht für &&) (XML-Attribute erlauben keine &, daher muss & verwendet werden)

Es können auch mehrere Bindings mit einem “,” separiert angegeben werden:

<TextBlock ColumnSpan="4" Bind="Value: $('DocParam.Notizen'), IsEnabled: 'false'" />

Value-Bind Beispiel:
Werte können auch an Controls gebunden werden um z. B. bei der letzten Seite eine Übersicht der eingegeben Daten anzuzeigen:

<Row>
  <Label Content="Notizen aktiv:" />
  <CheckBox IsEnabled="false" ColumnSpan="3" Bind="Value: $('DocParam.Erweitert')" />
</Row>
<Row>
  <Label Content="Notizen:" />
  <TextBlock IsEnabled="false" ColumnSpan="3" Bind="Value: $('DocParam.Notizen')" />
</Row>
<Row>
  <TextBlock>Number Input:</TextBlock>
  <TextBox Id="NumberTest" />
  <TextBlock>Number Output:</TextBlock>
  <TextBlock Bind="IsVisible: $('NumberTest') &gt;= 100">EQUAL OR OVER 100!</TextBlock>
  <TextBlock Bind="IsVisible: $('NumberTest') &lt; 100">BELOW 100!</TextBlock>
</Row>
<Row>
  <TextBlock>Number with Combine:</TextBlock>
  <TextBox Id="NumberTestA" />
  <TextBox Id="NumberTestB" />
</Row>
<Row>
  <TextBlock>Output:</TextBlock>
  <TextBlock Bind="IsVisible: $('NumberTestA') &gt; 100 &amp;&amp; $('NumberTestB') &gt; 100">Both are over 100!</TextBlock>
  <TextBlock Bind="IsVisible: $('NumberTestA') &gt; 100 || $('NumberTestB') &gt; 100">One Is over 100!</TextBlock>
</Row>

Calc-Erweiterung für Bindings

ab 3.2.1

Die Wertgrundlagen für die Bindings können mit mathematischen Funktionen erweitert werden. Das Ansprechen der Felder bleibt dabei gleich, $(‘DocParam.xy’). Um die Felder mathematisch miteinander zu verknüpfen, können die normalen Basisoperatorn (+-/*) verwendet werden.

Übersicht über alle möglichen Operatoren und wie sie verwendet werden:

Operatoren Beschreibung
Basis-Operatoren wie +,-,*,/ Basis Operatoren
Standard funktionen wie Quadratwurzel, sin,tan,cos etc Standard Funktionen
==/!=/<= etc Operationen Boolsche Operatoren
Weitere Funktionen rnd()

Die rnd()-Funktion wird zum Runden von Zahlen verwendet. Der ihr übergebene Wert wird auf die naheliegendste Ganzzahl gerundet

Beispiele zur Verwendung:

Calc('rnd(10.23 * 10) / 10';'F2') –> Rundet 102.3 auf die nächste Ganzzahl (102) und teilt diese wieder durch 10 –> 10.20
Calc('rnd(1510 / 100) * 100';'F0')) –> Rundet 15.10 auf die nächste Ganzzahl (15) und Multipliziert sie mit 100 –> 1500

Jeder Calc-Aufruf enthält als abschliessendes Argument den Formatierungsstring, vom Term separiert durch ein “;”. Dieser wert kann weggelassen werden (die umschliessenden ‘’ jedoch nicht), das “;” ist aber zwingend.

Formatierung:
N2 -> Zahl mit 2 Nachkommastellen (Standard)
C2 -> Währungsformat entsprechend der aktuell ausgewählten Dokumentsprache mit 2 Nachkommastellen

Komplette Liste mit Formatierungscodes: https://msdn.microsoft.com/de-de/library/dwhawy9k(v=vs.110).aspx

Syntax:

Calc('Term';'Format')  
Calc('$('DocParam.Field1') + $('DocParam.Field2')';'')  
Calc('$('DocParam.Field1') + ($('DocParam.Field2') * $('DocParam.Field2'))';'C2')  

WICHTIG:
Nach dem “;” muss entweder ein Wert, oder gar nichts stehen. Calc(‘Term’; ) führt zu einem Fehler, richtig ist Calc(‘Term’;’’)/Calc(‘Term’;’Format’)
Wird in der Calc Funktion ein Boolscher vergleich durchgeführt (Calc(‘DocParam.Node1 == DocParamNode2’;’F0’)), dann muss unbedingt beachtet werden, dass die Formatierung auf “F0” gsetzt ist, denn der Rückgabewert muss 0 oder 1 sein (für true/false) und wenn als Formatierung nicht F0 angegeben ist, wird der Wert zu 1.00 formatiert, was nicht als Boolsches true erkannt wird.
Wird der Vergleich so aufgebaut; Calc(‘Term’;’Format’) == ‘Value’, dann muss darauf geachtet werden, dass der entsprechende Value mit dem Richtigen Format angegeben wird (Standard xx.yy), ansonsten schlägt der Vergleich fehl; 10.00 == 10 wird als false ausgewertet.

Die verwendete Library ist fähig, Exponent-vor-Punkt-vor-Strich zu rechnen. -> ( a + b * c) == (a + (b * c)) != ((a + b ) * c)

Das Calc-Schlüsselwort ist Case-Insensitive

Die Calc-Funktion kann auf die Attribute

Value
IsEnabled
IsVisible

angewendet werden.

Beispiele

Value-Bind:

<Row>
  <Label Content="Addition" />
  <TextBox Id="DocParam.OutputAdd" ColumnSpan="3" Bind="Value: Calc('$('DocParam.Field1') + $('DocParam.Field2')';'C2')" />
</Row>  

IsVisible/IsEnabled-Bind:

<Row>
  <Label Content="IsVisible" />
  <TextBox Id="DocParam.OutputSubtract" ColumnSpan="3" Bind="IsVisible: Calc('$('DocParam.Field1') - $('DocParam.Field2')';'C2') == 'CHF 20.00'" />
</Row>
<Row>  
  <Label Content="IsVisible" />
  <TextBox Id="DocParam.OutputSubtract" ColumnSpan="3" Bind="IsVisible: Calc('$('DocParam.Field1') - $('DocParam.Field2')';'') == '20.00'" />
</Row>  

Weiter bietet die Calc-Funktion die Möglichkeit, angewählte Checkboxen zu “zählen”:

<Row Bind="IsVisible: Calc('$('Checkbox1') + $('Checkbox2') + $('Checkbox3') + $('Checkbox4')';'F0') == '2'">
  <Label Content="Label">
</Row>

Der Boolsche “Checked”-Value der Checkbox wird von der Calc-Funktion in einen Integer mit Wert 0 für false(= nicht angewählt) und 1 für true(= angewählt) umgewandelt, so das die Werte zusammengerechnet werden können. Das Obige Beispiel steht für: “Wenn Zwei der Checkboxen 1-4 (welche egal) angewählt sind, dann zeige die Row mit dem Label an.” Dabei muss ebenfalls auf den Formatierungswert geachtet werden: Zwingend ohne kommastellen, denn 1.00 ist nicht gleich 1, und kann dementsprechend nicht in einen Boolschen Wert zurückgewandelt werden.

Sofern keine Standardwerte in den CustomDataNodes vorgegeben sind, werden alle Calc-Binding Werte mit 0 initialisiert.
Insbesondere bei “IsEnabled” / “IsVisible” Bindings mit “Calc”-Bedingungen sollte man auf valide Standardwerte achten, ansonsten ist die Bedingung initial immer erfüllt.

DataSources

ab 3.1.1

Allgemein:

Mit den DataSources kann eine Datenbankabfrage in den Dokumenteparameter eingeschleust werden. Diese Abfragen werden beim Öffnen des DokumenteParameter Dialogs, jeh nach definiertem “Loadbehavior” (siehe Selector), aufgerufen. Die Daten aus der Abfrage können dann über das Mapping des Selectors auf CustomDataNodes gemappt werden

Die Grundstruktur für eine DataSource-Anbindung sieht folgendermassen aus:

<DataSources>
 <DataSource>
  <ConnectionProvider />
  <ConnectionString />
  <Selector LoadBehavior="Value">
   <Query />
   <Result>
   <!-- Pro Selektor kann entweder ein SingleMap oder ein CollectionMap definiert werden -->
    <SingleMap>
	  <Map Source="ColumnName1" Target="CustomDataNode1" />
	  <Map Source="ColumnName2" Target="CustomDataNode2" />
    </SingleMap>
    <CollectionMap id="IdOfCollection">
	</CollectionMap>
   </Result>
  </Selector>
 </DataSource>
</DataSources>

DataSource

Der DataSource-Node kann verschieden Typen annehmen. Der Name ist im XML identisch mit den hier aufgelisteten DataSource Typen.

Attribute und Elemente für jeden Typ DataSource:

Name Beschreibung
Id (Optional, Attribut) Gibt der DataSource eine Eindeutige Id
ConnectionProvider (Zwingend, Element) Definiert den ConnectionProvider für den entsprechenden Datenbank Typ. Über diesen Provider wird die Verbindung auf die Datebank hergestellt.
Übersicht über die ConnectionProvider des .NET Frameworks :
ConnectionString (Zwingend, Element) Der Connectionstring bietet die nötigen Informationen zum Herstellen der Verbindung auf die Datenbank. jede Datenbank definiert ihr eigenes Format für den ConnectionString
Selector (Zwingend, Element) Definiert die Datenbankabfrage (Query) und das entsprechende Mapping auf die DataNodes

Datenbanktypen und ihre typenspezifische Attribute

Typ Attribute
SqlDataSource SafeQuery
Wenn der Wert auf true gesetzt ist (standard), dann werden etwaige Parameter (siehe Selector–> Query) in der Query nicht mit den aktuellen Werten ersetzt, sondern es wird eine Parameter Liste mit dem Key Value paar an die Datenbank gesendet, und diese ersetzt dann die Werte in der Query. Dadurch entsteht eine erhöhte Sicherheit betreffend SQL-Injection

Selector

Der Selector definiert den Ausführzeitpunkt, die auszuführende Datenbankabfrage und das Enstprechende Mapping auf die CustomDataNodes. Eine DataSource kann beliebig viele Selectoren enthalten

Name Beschreibung
Id (Optional, Attribut) Innerhalb einer DataSource eineindeutig
LoadBehavior (Zwingend, Attribut) Definiert bei welcher Art von Aufruf des DP die abfrage ausgelöst werden soll. Die möglichen LoadBehaviors sind:
OnlyOnce (bei erster initierung des DP)
Always (immer wenn das DocParam Modul aufgerufen wird, , auch wenn das Modul aus dem generierten Dokument heraus geöffnet wird).
Query (Zwingend, Element) Die Abfrage welche auf der Datenbank ausgeführt wird. Mit {} können Platzhalter eingesetzt werden, und so z. B. auf den Wert eines CustomDataNodes verweisen => {DocParam.ValueToInject}. Wenn Platzhalter eingesetzt werden, muss beachtet werden, dass die CustomElements welche angesprochen werden einen Validen Standardwert haben, ansonsten kann es sein, dass die Abfrage Fehlschlägt, was dazu führen kann, dass das Öffnen des Dokumenteparameter Dialoges fehlschlägt. Wenn in der Query ein < oder ein > verwendet wird, dann muss diese in einem <![CDATA[InsertQueryHere]]> tag stehen.
Result (Zwingend, Element) Das Result Element des Selectors enthält die Informationen, wie die Werte aus der Datenbank auf die CustomElements gemappt werden sollen.
Dabei wird zwischen zwei Typen unterscheiden, CollectionMap und SingleMap. Die genaue Anwendung ist aufgrund der Komplexität nach der Tabelle aufegführt.

Das Mapping

Um das Mapping zu erklären, wird die folgende Grundkonfiguration verwendet:

<Configuration>  
  <CustomContentSection xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="{[DocParam.Config.WindowName]}" WindowHeight="450" WindowWidth="{[DocParam.Config.WindowWidth]}">  
   <DataNodes>  
     {[DocParam.EnableDocParamButton]}        
     <CustomDataNode xsi:type="TextNode" Id="DocParam.Name" LCID="1042" />  
     <CustomDataNode xsi:type="TextNode" Id="DocParam.Vorname" LCID="1042" />  
     <CustomDataNode xsi:type="TextNode" Id="DocParam.Funktion" LCID="1042" />  
     <CustomDataNode xsi:type="TextNode" Id="DocParam.Lohn" LCID="1042" />      
    </DataNodes>  
  </CustomContentSection>  
  <Views>  
   <DataNodes>  
    <Collection Id="MAList"></Collection>  
   </DataNodes>  
   <View Id="main" Label="{[DocParam.LabelMainView]}">
     <!-- Hier erfolgt die View-Konfiguration -->     
   </View>  
  </Views>  
  <DataSources>  
   <SqlDataSource>  
    <ConnectionProvider>System.Data.SqlClient</ConnectionProvider>  
    <ConnectionString>Data Source=SomeServer; DataBase=SomeDatabase; Integrated Security=true; </ConnectionString>  
    <SafeQuery>true</SafeQuery>  
    <Selector LoadBehavior="OnlyOnce">  
     <Query><![CDATA[SELECT Name, Vorname, Funktion, Lohn FROM tblMitarbeiter WHERE Name LIKE '%something%' AND Lohn > 20000]]> </Query>  
     <Result>  
	   <!-- Hier erfolgt die Konfiguration des Mappings -->
     </Result>  
    </Selector>  
   </SqlDataSource>  
  </DataSources>  
 </Configuration>

SingleMap

Mit dem SingleMap können einzelne Spalten aus der Datenbankabfrage auf einen CustomDataNode gemappt werden. Das Ziel ist nun, das Resultat aus der Datenbankabfrage in die konfigurierten DataNodes abzufüllen. Für das SingleMap sieht die Konfiguration innerhalb des <Result></Result> folgendermassen aus:

<Result>
  <SingleMap>
    <Map Source="Name" Target="DocParam.Name" />
    <Map Source="Vorname" Target="DocParam.Vorname" />
    <Map Source="Funktion" Target="DocParam.Funktion" />
    <Map Source="Lohn" Target="DocParam.Lohn" />      
  </SingleMap>
</Result>

Das “Source” Attribut enthält den Namen der Spalte aus der Datenbankabfrage, aus welcher der Wert ausgelesen werden soll. Das “Target” Attribut enthält den Namen des CustomDataNodes, auf welchen der Wert geschrieben werden soll. Für die entsprechenden CustomDataNodes kann dann auch ein View-Element erstellt werden, um den Wert darzustellen. Wird mit einem SingleMap auf einen TextNode gemapt, dann wird jeweils nur der erste Eintrag der Datenbankabfrage beachtet, alle anderen Einträge werden ignoriert. Wird hingegen auf ein ComboBox gemappt, werden sämtliche Werte aus der Spalte in die ComboBox eingfügt.

CollectionMap

Mit der CollectionMap kann eine Liste, die aus der Datenbankabfrage zurückgegeben wird, auf eine Collection geschrieben werden. Die Collection wird mit den entsprechenden Elementen befüllt. Auf diese Collection kann dann über eine ComboBox zugegriffen werden. Für das CollectionMap sieht die Konfiguration innerhalb des <Result></Result> folgendermassen aus:

<Result>
  <CollectionMap Id="MAList" /> 
</Result>

Das ColletionMap braucht nur die Id der entsprechenden Collection auf die die Werte geschrieben werden soll. Diese Collection ist Zwingend in den ViewDataNodes zu definieren. Die Collection wird dann folgendermassen befüllt:

<Collection Id="MaList">
  <Element>  
    <Text Id="Name">Muster</Text>  
    <Text Id="Vorname">Max</Text>  
    <Text Id="Funktion">Sachbearbeiter Administration</Text>  
    <Text Id="Lohn">5100</Text> 
  </Element>
  <Element>
    .
    .
  </Element>
   .
   .
</Collection>

Die Id der Text-Elemente innerhalb eines Elementes der Collection enthalten den Namen der Spalte aus der Datenbankabfrage, und entsprechend den Wert, welcher der ausgewertete Eintrag in der entsprechenden Spalte der Abfrage enthält. Auf diese Collection kann dann über eine ComboBox folgendermassen zugegriffen werden:

<ComboBox Id="MAList" CollectionLabelMember="Vorname" CollectionPlaceholder="Select">    
  <CollectionSelectionMap Source="Name" Target="DocParam.Name"></CollectionSelectionMap>  
  <CollectionSelectionMap Source="Vorname" Target="DocParam.Vorname"></CollectionSelectionMap>  
  <CollectionSelectionMap Source="Funktion" Target="DocParam.Funktion"></CollectionSelectionMap>  
  <CollectionSelectionMap Source="Lohn" Target="DocParam.Lohn"></CollectionSelectionMap>  
</ComboBox>

Der Wert, der in der ComboBox angezeigt wird, wird im CollectionLabelMember definiert, hier ist es beispielsweise der Vorname. Wird ein Wert in der ComboBox ausgewählt, werden die entsprechenden Werte aus der Collection (Source) in die im Mapping definierten DataNodes (Target) geschrieben. Hier ist wieder darauf zu achten, dass die Source der Id des Textes in der Collection, also dem Namen der Spalte aus der Datenbankabfrage, entspricht. Dasselbe gilt für das Target des entsprechenden DataNodes.

Beispiele

Konfiguration eines einfachen DokumentParameter mit Verwendung von Views

<Configuration>
  <CustomContentSection Name="Dokument-Parameter" WindowWidth="750" WindowHeight="750">
    <DataNodes>
      
      <Text Id="DocParam.Subject" />
      <DateTime Id="DocParam.CreationTime" Format="d. MMMM yyyy" />
      
      <CheckBox Id="DocParam.CheckBox1" />
      
      <ComboBox Id="DocParam.ComboBox1" SelectedValue="default">
        <Item DisplayText="Option 1" Value="opt1" />
        <Item DisplayText="Option 2" Value="opt2" />
        <Item DisplayText="Option 3" Value="opt3" />
      </ComboBox>
      
      <Text Id="DocParam.TextNodeForRadio" />
      <ComboBox Id="DocParam.ComboBoxForRadio">
        <Item DisplayText="Option 1" Value="opt1" />
        <Item DisplayText="Option 2" Value="opt2" />
        <Item DisplayText="Option 3" Value="opt3" />
      </ComboBox>
      
    </DataNodes>
  </CustomContentSection>
  <Views IsDebug="false">
    <View Id="main" Label="Startseite">
      <Row>
        <TextBlock Style="h1" ColumnSpan="4">Titel</TextBlock>
      </Row>
      <Row>
        <Separator ColumnSpan="4" />
      </Row>
      <Row>
        <Label Content="Betreff" />
        <TextBox Id="DocParam.Subject" ColumnSpan="3" />
      </Row>
      <Row>
        <Label Content="Datum" />
        <DatePicker Id="DocParam.CreationTime" ColumnSpan="3" />
      </Row>
      <Row>
        <CheckBox Id="DocParam.CheckBox1" Label="CheckBox mit ColumnOffset=1" ColumnOffset="1" ColumnSpan="2" />
      </Row>
      <Row>
        <Label Content="das ist eine Combobox" ColumnSpan="1" />
        <ComboBox Id="DocParam.ComboBox1" ColumnSpan="2" />
      </Row>
      <Row>
        <Label Content="RadioButton Basierend auf einem TextNode" ColumnSpan="4"></Label>
      </Row>
      <Row>
        <Separator ColumnSpan="4" />
      </Row>
      <Row>
        <!-- Konfiguration eines RadioButton über ein DataNode-Element vom Typ Text. Wenn das DataNode-Element vom Typ Text im Dokument verwendet wird, dann wird der Value der ausgewählten Option eingefügt. Die anderen Optionen können im Dokument nicht mehr angewählt werden, nur über den Dokument-Parameter-Dialog -->
        <RadioButton Id="DocParam.TextNodeForRadio" Value="opt1" Label="Option 1" />
        <RadioButton Id="DocParam.TextNodeForRadio" Value="opt2" Label="Option 2" />
        <RadioButton Id="DocParam.TextNodeForRadio" Value="opt3" Label="Option 3" />
      </Row>
      <Row>
        <!-- Fügt eine leere Row ein, kann so verwendet werden, um Elemente optisch besser zu trennen -->
        <TextBlock />
      </Row>
      <Row>
        <Label Content="RadioButton basierend auf einem ComboBoxNode" ColumnSpan="4" />
      </Row>
      <Row>
        <Separator ColumnSpan="4" />
      </Row>
      <Row>
         <!-- Konfiguration eines RedioButtons über ein DataNode-Element vom Typ ComboBox. Wenn das DataNode-Element vom Typ ComboBox im Dokument verwendet wird, wird das Label der ausgewählten Option angezeigt. Die anderen Optionen können über die ComboBox von Word weiterhin angewählt werden -->
        <RadioButton Id="DocParam.ComboBoxForRadio" Value="opt1" Label="Option 1" />
        <RadioButton Id="DocParam.ComboBoxForRadio" Value="opt2" Label="Option 2" />
        <RadioButton Id="DocParam.ComboBoxForRadio" Value="opt3" Label="Option 3" />
      </Row>
      <Button Type="Submit" Label="OK" IsDefault="true" />
      <Button Type="Cancel" Label="Abbrechen" />
    </View>
  </Views>
</Configuration>

Der dazugehörige Dialog:

DocumentParameterDialog

Konfiguration eines einfachen DokumenteParameter ohne Verwendung von Views

<Configuration>
  <CustomContentSection xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Dokument-Parameter" WindowWidth="750" WindowHeight="750">
    <DataNodes>      
      <CustomDataNode xsi:type="TextNode"     Id="DocParam.Subject"      LCID="2055" Row="1" Column="1" Label="Das ist ein TextNode"/>
      <CustomDataNode xsi:type="DateTimeNode" Id="DocParam.CreationTime" LCID="2055" Row="2" Column="1" IsNowDefault="true" DateFormat="d. MMMM yyyy" Calendar="Gregor" Label="Datumsauswahl"/>
      <CustomDataNode xsi:type="ComboBoxNode" Id="DocParam.ComboBox"     LCID="2055" Row="3" Column="1" ColumnSpan="1"  Label="Dies ist eine Combobox" SelectedValue="default">
        <ListItems>
          <Item>
            <Key><string>default</string></Key>
            <Value><string>default</string></Value>
          </Item>
          <Item>
            <Key><string>opt1</string></Key>
            <Value><string>Option 1</string></Value>
          </Item>
          <Item>
            <Key><string>opt2</string></Key>
            <Value><string>Option 2</string></Value>
          </Item>
        </ListItems>
      </CustomDataNode>
      <!-- ColumnOffset wird nur mit Views verwendet, ohne Views wird direkt die Column angegeben, in welcher das Element platziert werden soll -->
      <CustomDataNode xsi:type="CheckBoxNode" Id="DocParam.CheckBox"  LCID="2055" Row="3" Column="2" Label="Eine Checkbox" IsChecked="false" ></CustomDataNode>            
    </DataNodes>
  </CustomContentSection>  
</Configuration>

Der dazugehörige Dialog:

DocumentParameterDialog

Validierung

<Configuration>
  <CustomContentSection Name="Dokument-Parameter" WindowWidth="750" WindowHeight="750">
    <DataNodes>   
      
      <Text Id="DocParam.Subject" Required="true" ValidationMessage="Bitte geben sie einen Betreff ein" />
      <Text Id="DocParam.4NumbersMax" Regex="^[0-9]{1,4}$" ValidationMessage="Die Zahl darf maximal aus vier Ziffern bestehen und muss natürlich sein" />
      
    </DataNodes>
  </CustomContentSection>
  <Views>
    <View Id="main" Label="Startseite">
      <Row>
        <TextBlock Style="h1" ColumnSpan="4">Titel</TextBlock>
      </Row>
      <Row>
        <Separator ColumnSpan="4"/>
      </Row>
      <Row>
        <Label Content="Betreff" />
        <TextBox Id="DocParam.Subject" ColumnSpan="3" />
      </Row>
       <Row>
        <Label Content="Maximal Vierstellige, natürlich Zahl" />
        <TextBox Id="DocParam.4NumbersMax" ColumnSpan="3" />
      </Row>
      <Button Type="Submit" Label="OK" IsDefault="true" />
      <Button Type="Cancel" Label="Abbrechen" />
    </View>
  </Views>
</Configuration>

Verhalten des Dialoges

DocumentParameterDialog

Binding Beispiele
Standard Bindings

<Configuration>
  <CustomContentSection Name="Dokument-Parameter" WindowWidth="750" WindowHeight="750">
    <DataNodes> 
      
      <CheckBox Id="DocParam.Checkbox1" />
      <Text Id="DocParam.TextNode1" />
      
    </DataNodes>
  </CustomContentSection>
  <Views>
    <View Id="main" Label="Startseite">
      <Row>
        <TextBlock Style="h1" ColumnSpan="4">Titel</TextBlock>
      </Row>
      <Row>
        <Separator ColumnSpan="4"/>
      </Row>      
      <Row>
        <Label Content="Name für CustomLabel"></Label>
        <TextBox Id="DocParam.TextNode1"></TextBox>
      </Row>
      <Row>
        <CheckBox Id="DocParam.Checkbox1" Label="Zeige CustomLabel"></CheckBox>
      </Row>
      <Row>
       <Label Content="CustomLabel: " Bind="IsVisible: $('DocParam.Checkbox1')"></Label>
        <!-- Einfaches, Doppeltes Binding mit einer Bedingung pro gebindetem Attrbut (isVisible, Value) -->
        <TextBlock Bind="IsVisible: $('DocParam.Checkbox1'), Value: $('DocParam.TextNode1')"></TextBlock>
      </Row>
        <!-- Einfaches Value Binding -->
      <Row Bind="IsVisible: $('DocParam.TextNode1') == 'Hello'">
        <TextBlock>CustomLabel hat den Wert 'hello'</TextBlock>
      </Row>
      <!-- IsVisible-Binding mit einer UND Bedingung (&& → &amp;&amp; ) -->
      <Row Bind="IsVisible: $('DocParam.Checkbox1') &amp;&amp; $('DocParam.TextNode1') == 'Hello'">
        <TextBlock Value="">CustomLabel ist sichtbar UND hat den Wert 'Hello'</TextBlock>
      </Row>  
      <!-- IsVisible-Binding mit einer ODER Bedingung -->
      <Row Bind="IsVisible: $('DocParam.Checkbox1') || $('DocParam.TextNode1') == 'hello'">
        <TextBlock>CustomLabel ist sichtbar ODER hat den Wert 'hello'</TextBlock>
      </Row>
      <Button Type="Submit" Label="OK" IsDefault="true" />
      <Button Type="Cancel" Label="Abbrechen" />
    </View>
  </Views>
</Configuration>

Das Verhalten des Dialoges:

DocumentParameterDialog

Calc-Bindings

<Configuration>
  <CustomContentSection Name="Dokument-Parameter" WindowWidth="750" WindowHeight="750">
    <DataNodes>
      
      <!-- EingabeFelder für die mathematischen Funktionen mit validen Standardwerten-->
      <Text Id="DocParam.Field1">1</Text>
      <Text Id="DocParam.Field2">1</Text>
      
      <Text Id="DocParam.TestNode2" />
      <Text Id="DocParam.OutputAdd" />
      <Text Id="DocParam.OutputSubtract" />
      <Text Id="DocParam.OutputDivide" />
      <Text Id="DocParam.OutputMultiply" />
      <Text Id="DocParam.CB1" />
      <Text Id="DocParam.CB2" />
      <Text Id="DocParam.CB3" />
      <Text Id="DocParam.CB4" />
        
    </DataNodes>
  </CustomContentSection>
  <Views>
    <View Id="main" Label="Startseite">      
      <Row>
        <TextBlock Style="h1" ColumnSpan="4">Titel</TextBlock>
      </Row>
      <Row>
        <Separator ColumnSpan="4"/>
      </Row>
      <Row>
        <Label Content="Wert 1" />
        <TextBox Id="DocParam.Field1" ColumnSpan="3"/>
      </Row>
      <Row>
        <Label Content="Wert 2" />
        <TextBox Id="DocParam.Field2" ColumnSpan="3" />
      </Row>    
      <Row Bind="IsVisible: Calc('$('DocParam.Field1') + $('DocParam.Field2') &gt; 1000';'F0') ">
        <TextBlock>Wert1 + Wert2 Ergeben mehr als 1000</TextBlock>
      </Row>
      <Row>
        <Label Content="Ergebnis Addition" />
        <!-- Simples CalcBinding mit Addition und Formatierung auf zwei Nachkomastellen im Währungsformat -->
        <TextBox Id="DocParam.OutputAdd" ColumnSpan="3" Bind="Value: Calc('$('DocParam.Field1') + $('DocParam.Field2')';'C2')" />
      </Row>
      <Row>
        <Label Content="Ergebnis Subtraktion" />
         <!-- Simples CalcBinding mit Subtraktion und Formatierung auf zwei Nachkomastellen im Währungsformat -->
        <TextBox Id="DocParam.OutputSubtract" ColumnSpan="3" Bind="Value: Calc('$('DocParam.Field1') - $('DocParam.Field2')';'C2')" />
      </Row>
      <Row>
        <Label Content="Ergebnis Division" />
         <!-- Simples CalcBinding mit Divison und Formatierung auf drei Nachkomastellen im Dezimalformat -->
        <TextBox Id="DocParam.OutputDivide" ColumnSpan="3" Bind="Value: Calc('$('DocParam.Field1') / $('DocParam.Field2')';'F3')" />
      </Row>
      <Row>
        <Label Content="Ergebnis Multiplikation" />
         <!-- Simples CalcBinding mit Multiplikation und Formatierung auf zwei Nachkomastellen im Währungsformat -->
        <TextBox Id="DocParam.Outputmultiply" ColumnSpan="3" Bind="Value: Calc('$('DocParam.Field1') * $('DocParam.Field2')';'C2')" />
      </Row>     
      <Row>
        <CheckBox Id="DocParam.CB1" Label="CB1"></CheckBox>  
        <CheckBox Id="DocParam.CB2" Label="CB2"></CheckBox>
        <CheckBox Id="DocParam.CB3" Label="CB3"></CheckBox> 
        <CheckBox Id="DocParam.CB4" Label="CB4"></CheckBox>     
      </Row>  
      <!-- Calc Binding um angewählte Checkboxen zu "zählen" -->
      <Row Bind="IsVisible: Calc('$('DocParam.CB1') + $('DocParam.CB2') + $('DocParam.CB3') + $('DocParam.CB4')';'F0') == '1'">
        <Label Content="Eine Checkbox angewählt"></Label>
      </Row>       
      <Row Bind="IsVisible: Calc('$('DocParam.CB1') + $('DocParam.CB2') + $('DocParam.CB3') + $('DocParam.CB4')';'F0') == '2'">
        <Label Content="Zwei Checkboxen angewählt"></Label>
      </Row>      
      <Row Bind="IsVisible: Calc('$('DocParam.CB1') + $('DocParam.CB2') + $('DocParam.CB3') + $('DocParam.CB4')';'F0') == 3">
        <Label Content="Drei Checkboxen angewählt"></Label>
      </Row>       
      <Row Bind="IsVisible: Calc('$('DocParam.CB1') + $('DocParam.CB2') + $('DocParam.CB3') + $('DocParam.CB4')';'F0') == 4">
        <Label Content="Vier Checkboxen angewählt"></Label>
      </Row>     
      <Button Type="Submit" Label="OK" IsDefault="true" />
      <Button Type="Cancel" Label="Abbrechen" />
    </View>
  </Views>  
</Configuration>

Verhalten des Dialoges:

DocumentParameterDialog