head.WriteLine()

Montag, August 22, 2011

TT.DataForm: Data Binding

Nach der kurzen Einführung hier, gehe ich in den folgenden Posts näher auf die Features von TT.DataForm ein. Den Anfang mache ich mit dem Thema Data Binding.

Datenquellen

Eine Datenquelle bindet man an TT.DataForm über die Eigenschaft DataSource. Hierbei kann eine beliebige Datenquelle angegeben werden – unabhängig davon ob es sich um eine einzelnes Objekt oder eine Liste handelt. Die folgenden Datentypen werden hierbei unterstützt:
  • System.Object
  • System.Type
  • IEnumerable
  • ICollectionView
  • CollectionViewSource
  • ListCollectionView
Darüber hinaus kann TT.DataForm auch mit dem Data Source Windows von Visual Studio verknüpft werden, dass ein direktes Einfügen aus der Toolbox möglich ist.
DataSourceWindow_thumb4

Metadaten

Die Generierung der Oberfläche erfolgt auf Grundlage von Metadaten, welche die Datenquelle in Form von Data Annotations bereit stellt. So werden zum Beispiel die Labels mit den Anzeigenamen belegt, die über das Display-Attribut angegeben wurden. Beispiel:
using System.ComponentModel.DataAnnotations;
public class Person
{
  [Required]
  [Editable(false)]
  [Display(Name = "ID", Description = "The id of the person.")]
 
[DisplayFormat(DataFormatString = "#{0}")]
  public int Id { get; set; }

  [Required]
  [StringLength(50)]
  [Display(Name = "Fullname",
    Description="The full name of the person.")]
  public string Name { get; set; } 
  …
}

Hierbei werden sowohl die Anzeigeattribute, als auch die Formatierungen und Validierungsregeln von TT.DataForm bei der Generierung berücksichtigt.

Lookup-Daten

Oft werden neben der primären Datenquelle zusätzliche Daten, zum Beispiel für ComboBoxen benötigt. Hierfür bietet TT.DataForm die Methode SetAssociationSource(), sowie die Eigenschaft SubDataSources. Mit Ihnen können mit der Hauptdatenquelle verknüpfte Datenquellen angegeben werden. Hierbei wird jeweils der Name der Eigenschaft in der Hauptdatenquelle, sowie die Liste der verknüpften Datenquelle angegeben.
Der folgende Code zeigt ein einfaches Beispiel:
var list = new ObservableCollection<Department>()
{
  new Department { Id = 1, Name = "Development" }
}
var persons = new ObservableCollection<Person>()
{
  new Person
  {
    Id = 1,
    Name = "Jörg Neumann",
    Department = departments[0]
  }
};
dataForm.DataSource = persons;
dataForm.SetAssociationSource("Department", departments);

Daraufhin erzeugt TT.DataForm für die Department-Eigenschaft eine Combobox und bindet diese an die angegebene Quelle.
SubDataSources_thumb2
Die Eigenschaft SubDataSources ist empfehlenswert, wenn die Quelle per Markup zugewiesen werden soll und die Anwendung dem MVVM-Pattern folgt. Hierbei muss als Quelle lediglich der Name der entsprechenden ViewModel-Eigenschaft angegeben werden, welche die verknüpfte Datenquelle zu Verfügung stellt.
ViewModel:
class PersonViewModel
{
public ObservableCollection<Person> Persons { get; }
public ObservableCollection<Departments> Departments { get; }
}

View:
<tt:DataForm DataSource = "{Binding Persons}">
  <tt:DataForm.SubDataSources>
  <tt:SubDataSource
    EntityPropertyName = "Department"
    DataSourcePropertyName = "Departments"/>
  <tt:DataForm.SubDataSources>
</tt:DataForm>

Im nächsten Post beschreibe ich, wie das Mapping zwischen Datenquelle und UI-Element beeinflusst werden kann.

Labels: