head.WriteLine()

Dienstag, August 23, 2011

TT.DataForm: Mappings

Nachdem ich hier bereits die Data Binding-Mechanismen von TT.DataForm beschrieben habe, soll es in diesem Post um die Anpassung der UI-Generierung gehen. Hierfür stehen zwei Modelle zu Verfügung: Control Mappings und Item Definitions.

Control Mappings

Mit den Control Mappings kann konfiguriert werden, in welcher Form die zu Verfügung gestellten Daten in UI-Elemente umgesetzt werden sollen. Standardmäßig verfolgt TT.DataForm das folgende Mapping:

Datentyp Input Control
int, double, decimal NumericUpDown
string TextBox
DateTime DatePicker
bool CheckBox
ImageSource Image
Sonstige TextBlock

Um dieses Mapping anzupassen, können ControlMapping-Objekte definiert und über die ControlMapping-Eigenschaft zugewiesen werden. Hierbei stehen die folgenden Möglichkeiten zu Verfügung:
  • Mapping auf Feldebene
  • Mapping auf Datentypebene
  • Definition eines DataTemplate
  • Angabe von Metadaten
Hier ein paar Beispiele:

<dataform:DataForm.ControlMappings>
  <dataform:ControlMapping ControlType="{x:Type TextBox}"
                           BindingPropertyName="Text"
                           DataPropertyName="Id" />
  <dataform:ControlMapping DataType="{x:Type sys:String}"
                           ControlType="{x:Type TextBlock}"
                           BindingPropertyName="Text" />
  <dataform:ControlMapping DataType="{x:Type sys:DateTime}"
                           IsReadOnly="True"
                           Description="The birthday.">
    <dataform:ControlMapping.ColumnTemplate>
      <DataTemplate>
        <TextBox Text="{Binding Path=Birthday,
                        StringFormat={}{0:dd. MMMM yyyy}}"
                        IsReadOnly="False" />
      </DataTemplate>
    </dataform:ControlMapping.ColumnTemplate>
  </dataform:ControlMapping>
</dataform:DataForm.ControlMappings>


In diesem Beispiel wurde festgelegt, dass die Eigenschaft Id als TextBox (statt als NumericUpDown) gerendert und hierbei die Text-Eigenschaft gebunden werden soll. Darüber hinaus wurde festgelegt, dass alle Eigenschaften vom Typ string in Form von TextBlock (statt TextBox) dargestellt werden. Für den Datentyp DateTime wurde zusätzlich festgelegt, dass alle Felder des Typs schreibgeschützt dargestellt werden sollen. Diese Art der Metadatenangabe kann sinnvoll sein, wenn die Datenquelle nicht mit Data Annotations attributiert wurde, bzw. die Angaben überschrieben werden soll. Zuletzt wurde für das Feld Birthday ein eigenes DataTemplate definiert. Dies kann dann sinnvoll sein, wenn das zu erzeugende UI-Control speziell konfiguriert oder das Binding zum Beispiel mit einem ValueConverter versehen werden muss.

Item Definitions

Die Item Definitions erfüllen im Grunde den gleichen Zweck wie die Control Mappings, erlauben hierbei jedoch weitaus mehr Anpassungsmöglichkeiten. So kann zum Beispiel nicht nur das Eingabeelement, sondern auch das Anzeigeelement festgelegt werden. Darüber hinaus können Item Definitions sowohl für gebundene, als auch für ungebundene Felder definiert werden. Das bedeutet, dass die Oberfläche zum Beispiel ein Notizfeld enthalten kann, obwohl die Datenquelle keine entsprechende Eigenschaft bereitstellt.
Die Erstellung von Item Definitions erfolgt über die Eigenschaft DataFormItems. Hierüber können ein oder mehrere DataFormItem-Objekte zugewiesen werden. Diese bestimmen über die Eigenschaften Header und Content den Anzeigetext bzw. das zu verwendende Eingabeelement.
Hier ein Beispiel für die Definition von Item Definitions:

<dataform:DataForm.DataFormItems>
  <dataform:DataFormItem Header="ID:">
    <dataform:DataFormItem.Content>
      <controls:NumericUpDown Width="100"
       
HorizontalAlignment="Left"
        Value="{Binding Path=Id, ValidatesOnDataErrors=True}"/>
    </dataform:DataFormItem.Content>
  </dataform:DataFormItem>
  <dataform:DataFormItem>
    <dataform:DataFormItem.Header>
      <TextBlock Text="Name:" />
    </dataform:DataFormItem.Header>
    <dataform:DataFormItem.Content>
      <TextBox Text="{Binding Path=Name}" />
    </dataform:DataFormItem.Content>
  </dataform:DataFormItem>
</dataform:DataForm.DataFormItems>


Wie zu sehen ist, kann die Header-Eigenschaft entweder mit einem einfachen Text, oder mit einem beliebigem Control gefüllt werden.

Im nächsten Post geht es um die grafischen Anpassungsmöglichkeiten von TT.DataForm.

Labels: