The Artima Developer Community
Sponsored Link

.NET Buzz Forum
WPF: DataSet und Data Binding

0 replies on 1 page.

Welcome Guest
  Sign In

Go back to the topic listing  Back to Topic List Click to reply to this topic  Reply to this Topic Click to search messages in this forum  Search Forum Click for a threaded view of the topic  Threaded View   
Previous Topic   Next Topic
Flat View: This topic has 0 replies on 1 page
-

Posts: 1524
Nickname: nitronic
Registered: Jul, 2006

Norbert Eder works as a software architect.
WPF: DataSet und Data Binding Posted: Jul 9, 2008 12:02 PM
Reply to this message Reply

This post originated from an RSS feed registered with .NET Buzz by -.
Original Post: WPF: DataSet und Data Binding
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Latest .NET Buzz Posts
Latest .NET Buzz Posts by -
Latest Posts From Norbert Eder - Living .NET

Advertisement
Gerade zum Thema Data Binding habe ich mittlerweile einige Beispiele erstellt (siehe hier, hier und hier). Was noch fehlt (und oft gefragt wird) ist, wie ein DataSet gebunden werden kann. Dem möchte sich dieser Artikel widmen.

Auch in diesem Fall ändert sich relativ wenig. Anstatt eines konkreten Objektes steht nun ein DataSet zur Verfügung. Dieses kann Tabellen enthalten (0 - n) und jede Tabelle kann Spalten enthalten. Das Grundprinzip besteht nun einfach darin:

Vorgehensweise anhand einer TreeView


Das DataSet wird als DataContext bei der TreeView gesetzt. Das Root-Element wird beispielsweise per Hand (Markup) angelegt. Diesem wird nun eine Tabelle des DataSets als ItemsSource gesetzt. In weiterer Folge wird ein HierarchicalDataTemplate erstellt, welches nun dafür zuständig ist, die einzelnen Felder (oder auch nur ein paar wenige davon) darzustellen.

In weiterer Folge kann nun eine Eingabemaske erstellt werden, welche an das SelectedItem der TreeView gebunden ist und den ausgewählten Datensatz zur Anzeige bringt und somit bearbeitbar macht.

Konkretes Beispiel


Ob nun das DataSet aus einer Datenbank geladen oder manuell erstellt wird, macht keinen Unterschied. In diesem Beispiel wird ein DataSet per Code generiert und zur Verfügung gestellt:
public static class DataSetMock
{
    public static DataSet CreateDataSet()
    {
        DataSet ds = new DataSet();

        ds.Tables.Add("Person");

        ds.Tables[0].Columns.Add("FirstName");
        ds.Tables[0].Columns.Add("LastName");

        ds.Tables[0].Rows.Add("Norbert", "Eder");
        ds.Tables[0].Rows.Add("Hugo", "Tester");

        return ds;
    }
}

Dies geschieht in diesem Fall durch eine statische Klasse. Die Methode CreateDataSet kann nun über einen ObjectDataProvider via XAML zur Verfügung gestellt werden. Damit beschränken wir uns beim Schreiben von Sourcecode auf die Implementierung eben dieser statischen Klasse.

Wie bereits angesprochen, wird das DataSet in diesem Beispiel über ObjectDataProvider zur Verfügung gestellt:
<ObjectDataProvider 
    x:Key="PeopleProvider" 
    MethodName="CreateDataSet" 
    ObjectType="{x:Type local:DataSetMock}"/>

Der Provider selbst muss in den entsprechenden Ressourcen (in diesem Fall in den Ressourcen des Fensters) definiert werden.

In weiterer Folge wird nun ein TreeView-Element auf dem Fenster positioniert. Als DataContext wird der zuvor erstellte Provider gesetzt, da dieser die generierten Daten (DataSet) zurück liefert:
<TreeView 
    DataContext="{StaticResource PeopleProvider}" 
    x:Name="PeopleTreeView" 
    DockPanel.Dock="Left" 
    Width="200">
    <TreeViewItem 
        x:Name="PeopleRoot" 
        Header="People" 
        ItemsSource="{Binding Person}" 
        ItemTemplate="{StaticResource PersonTemplate}"/>
</TreeView>

Im Source ist zusätzlich zu sehen, dass eine Root-Node über das Markup erstellt wird. Diesem Root-Node wird als ItemsSource nun per Binding die Tabelle Person aus dem DataSet zugewiesen. Dadurch wird der Gültigkeitsbereich des Bindings für diese Node festgelegt. Somit kann nun ein ItemTemplate definiert werden, welches für die Darstellung der einzelnen Datensätze zuständig ist:
<HierarchicalDataTemplate x:Key="PersonTemplate">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding LastName}"/>
        <TextBlock Text=", "/>
        <TextBlock Text="{Binding FirstName}"/>
    </StackPanel>
</HierarchicalDataTemplate>

Dieses Template wird ebenfalls in den Ressourcen des Fensters abgelegt. Zusätzlich muss es der Root-Node als ItemTemplate zugewiesen werden.

Das wären bezüglich TreeView alle notwendigen Schritte. Möchte man nun ein Eingabeformular erstellen, welches die Daten des aktuell selektierten Datensatzes anzeigen soll, dann kann nun folgendes definiert werden:
<StackPanel Orientation="Vertical">
    <TextBlock Text="Firstname"/>
    <TextBox 
        Text="{Binding 
            ElementName=PeopleTreeView, 
            Path=SelectedItem.FirstName}"/>
    <TextBlock Text="Lastname"/>
    <TextBox 
        Text="{Binding 
            ElementName=PeopleTreeView, 
            Path=SelectedItem.LastName}"/>
</StackPanel> 

Was passiert hier? Es wird ein StackPanel definiert, welches alle Kind-Elemente untereinander anordnet. Die Elemente vom Typ TextBlock stellen die Überschriften dar. Für die eigentlichen Daten wird jeweils eine TextBox verwendet. Diese enthalten ein Binding auf die jeweilige Spalte des aktuell selektierten Datensatzes. Änderungen schlagen sich natürlich sofort auf die TreeView durch.

Fazit


Das Data Binding funktioniert grundsätzlich immer gleich. Wichtig ist, dass bewußt ist, wann welcher Kontext gesetzt wird und was dieser Kontext tatsächlich zur Verfügung stellt. Darauf kann gebunden werden. Dies verhält sich bei einem DataSet gleich wie bei einer Objekthierarchie.

Das gezeigte Beispiel steht natürlich als Download zur Verfügung.

Read: WPF: DataSet und Data Binding

Topic: ReMIX UK 08 Previous Topic   Next Topic Topic: Powerset joins Live Search

Sponsored Links



Google
  Web Artima.com   

Copyright © 1996-2019 Artima, Inc. All Rights Reserved. - Privacy Policy - Terms of Use