Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort zur 5. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Weitere .NET-Datentypen
7 Weitere Möglichkeiten von C#
8 Auflistungsklassen (Collections)
9 Fehlerbehandlung und Debugging
10 LINQ to Objects
11 Multithreading und die Task Parallel Library (TPL)
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 Einige wichtige .NET-Klassen
15 Projektmanagement und Visual Studio 2010
16 XML
17 WPF – Die Grundlagen
18 WPF-Containerelemente
19 WPF-Steuerelemente
20 Konzepte der WPF
21 Datenbindung
22 2D-Grafik
23 ADO.NET – verbindungsorientierte Objekte
24 ADO.NET – Das Command-Objekt
25 ADO.NET – Der SqlDataAdapter
26 ADO.NET – Daten im lokalen Speicher
27 ADO.NET – Aktualisieren der Datenbank
28 Stark typisierte DataSets
29 LINQ to SQL
30 Weitergabe von Anwendungen
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual C# 2010 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2010

Visual C# 2010
geb., mit DVD
1295 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1552-7
Pfeil 21 Datenbindung
Pfeil 21.1 Wichtige Klassen
Pfeil 21.1.1 Die Klasse »Binding«
Pfeil 21.1.2 Die Klasse »DataContext«
Pfeil 21.2 Einfache Datenbindung
Pfeil 21.2.1 Bindung mit Code erzeugen
Pfeil 21.2.2 Bindungsrichtung
Pfeil 21.2.3 Änderung der Datenquelle
Pfeil 21.2.4 Weitere Möglichkeiten im Zusammenhang mit der Datenbindung
Pfeil 21.2.5 Die Ereignisse »SourceUpdated« und »TargetUpdated«
Pfeil 21.3 Verschiedene Datenbindungsquellen
Pfeil 21.3.1 Bindung an einfache Objekte
Pfeil 21.3.2 Auflistungen binden
Pfeil 21.4 DataTemplates festlegen
Pfeil 21.4.1 Trigger
Pfeil 21.5 Daten konvertieren
Pfeil 21.5.1 Beispielprogramm
Pfeil 21.5.2 Mehrfachbindungen und »Converter«-Klassen
Pfeil 21.6 Die Klasse »ObjectDataProvider«
Pfeil 21.7 WPF und ADO.NET
Pfeil 21.7.1 Ausgabe in einer ListBox
Pfeil 21.7.2 Eine Tabelle im DataGrid-Steuerelement
Pfeil 21.7.3 WPF und LINQ to SQL


Galileo Computing - Zum Seitenanfang

21.4 DataTemplates festlegen Zur nächsten ÜberschriftZur vorigen Überschrift

In der ListBox des vorhergehenden Beispiels wird nur der Name angezeigt. Im Grunde genommen erstaunt das nicht, denn woher soll auch die ListBox wissen, welche Darstellungsform der Anzeige wir uns wünschen. Die ListBox reagiert nur auf die Angabe, die wir unter der Eigenschaft DisplayMemberPath gemacht haben. Die Eigenschaft selbst erlaubt keine komplexeren Darstellungsmöglichkeiten.

DataTemplates schaffen hier Abhilfe. Sie gestatten, die Inhalte und deren Darstellung exakt festzulegen. Damit wird es uns möglich, nicht nur mehrere Inhalte in einer Zeile auszugeben. Wir können darüber hinaus auch in jeglicher anderer Weise die Darstellung manipulieren, beispielsweise durch alternierende Farben.

DataTemplates ähneln den ControlTemplates. Sie können sie im Window.Resources-Abschnitt festlegen und die Darstellung der Daten ähnlich beschreiben, wie Sie auch einem Steuerelement mit einem ControlTemplate zu einer anderen Darstellung verhelfen. Der folgende XAML-Code zeigt, wie Sie das Beispiel ListBoxBinding ergänzen können, um in der ListBox neben dem Namen der Person auch deren Alter auszugeben. Beachten Sie die Angabe des Datenobjekts mit DataType als Eigenschaft des DataTemplate-Elements. Damit wird zum Ausdruck gebracht, dass Person-Objekte durch diese Schablone ersetzt werden.


<Window.Resources>
  <DataTemplate x:Key="PersonTemplate" DataType="{x:Type local:Person}">
    <Grid>
      <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
      </Grid.ColumnDefinitions>
      <TextBlock Width="100" Grid.Column="0" Text="{Binding Path=Name}" />
      <TextBlock Width="30" Grid.Column="1" Text="{Binding Path=Alter}" />
    </Grid>
  </DataTemplate>
</Window.Resources>

Eine Anpassung des ListBox-Elements ist ebenfalls notwendig. Es benötigt nun nicht mehr die Angabe der Eigenschaft DisplayMemberPath. Dafür geben Sie der Eigenschaft ItemTemplate den Key der Ressource an.


<ListBox Grid.Column="0" Name="lstPersonen" ItemsSource="{Binding}"
         ItemTemplate="{StaticResource PersonTemplate}" />

In Abbildung 21.4 sehen Sie, wie die ListBox unter Zuhilfenahme der DataTemplate die Elemente anzeigt.

Die Schablone lässt sich auch direkt im Steuerelement angeben. Hierfür für die Eigenschaft ItemTemplate bereitgestellt, in die das DataTemplate eingebettet wird.


<ListBox Grid.Column="0" Name="lstPersonen" ItemsSource="{Binding}">
  <ListBox.ItemTemplate>
    <DataTemplate DataType="{x:Type local:Person}">
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition /><ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TextBlock Width="100" Grid.Column="0" Text="{Binding Path=Name}" />
        <TextBlock Width="30" Grid.Column="1" Text="{Binding Path=Alter}" />
      </Grid>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Der Nachteil ist, dass dieses DataTemplate nicht von anderen Steuerelementen genutzt werden kann.

Abbildung 21.4 ListBox mit DataTemplate


Galileo Computing - Zum Seitenanfang

21.4.1 Trigger topZur vorigen Überschrift

Vorlagen können mit Triggern ausgestattet werden. Das gilt nicht nur für ContentTemplate, sondern auch für DataTemplate. Trigger gestatten es einem Template, auf Veränderungen von Daten zu reagieren und die Darstellung anzupassen. Wenn Sie Trigger wie in Kapitel 20, »Konzepte der WPF«, beschrieben einsetzen, kann der Trigger nur auf die Veränderung des Steuerelements selbst reagieren. Um auf eine Veränderung der Datenquelle reagieren zu können, gibt es mit DataTrigger und MultiDataTrigger zwei weitere Klassen.

DataTrigger arbeiten mit der Datenverbindung. Sie können eine beliebige Eigenschaft des Objekts abfragen und dann entsprechend darauf reagieren. Das sei am Beispiel der Klasse Person gezeigt. Dabei sollen die Person-Objekte, die das Rentenalter erreicht oder überschritten haben, in der ListBox mit rotem Hintergrund dargestellt werden. Aus diesem Grund erweitern wir die Klasse um die Eigenschaft Rente.


public class Person : INotifyPropertyChanged {
  private bool _Rente;
  public bool Rente {
    get {
      return _Rente;
    }
    private set {
      _Rente = value;
      OnPropertyChanged(new PropertyChangedEventArgs("Rente"));
    }
  }
  ...
}

Eigentlich würde uns hier eine schreibgeschützte Eigenschaft ausreichen. Da wir aber erwarten, dass datenbindende Objekte bei einer Änderung der Eigenschaft Notiz von der Änderung nehmen, muss das Ereignis PropertyChanged ausgelöst werden. Das kann nur im Setter passieren. Um dennoch nach außen eine schreibgeschützte Eigenschaft vorzugaukeln, ist der Setter private.

Das Window soll gegenüber dem vorhergehenden Beispiel ein ansehnlicheres Layout erfahren. Darüber hinaus soll gezeigt werden, wie eine Person gelöscht werden kann (was im Grunde genommen kein großes Problem sein sollte). Zum Testen der datengebundenen Eigenschaft Rente enthält das Fenster eine Schaltfläche, mit der das Alter der aktuell selektierten Person auf einen statischen Wert vergrößert wird, der dem definierten Rentenalter entspricht (siehe Abbildung 21.5).

Abbildung 21.5 Fenster des Beispiels »DataTriggerSample«

Der DataTrigger ähnelt einem Eigenschaftstrigger. Er wird an die Eigenschaft Rente der Datenbindung gebunden. Ist die Eigenschaft True, wird der Hintergrund des Grid-Elements auf die Farbe Rot gesetzt.


<DataTemplate x:Key="PersonTemplate" DataType="{x:Type local:Person}">
  <Grid Name="personzeile">
    ...
  </Grid>
  <DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=Rente}" Value="True">
      <Setter Property="Background" Value="Red" TargetName="personzeile" />
    </DataTrigger>
  </DataTemplate.Triggers>
</DataTemplate>

Aus Platzgründen soll an dieser Stelle der XAML-Code nicht vollständig wiedergegeben werden. Einzig und allein der C#-Code der vier Click-Ereignisse sei an dieser Stelle gezeigt:


// ---------------------------------------------------------
// Beispiel: ...\Kapitel 21\DataTriggerSample
// ---------------------------------------------------------
private void btnAddPerson_Click(object sender, RoutedEventArgs e) {
  personen.Add(new Person("Walter", 54));
}
private void btnSelectedPerson_Click(object sender, RoutedEventArgs e) {
  Person p = (Person)lstPersonen.SelectedItem;
  string str = "Folgende Person wurde ausgewählt:\n";
  MessageBox.Show(str + p.Name + " / " + p.Alter);
}
private void btnDeletePerson_Click(object sender, RoutedEventArgs e) {
  personen.Remove((Person)lstPersonen.SelectedItem);
}
private void btnEditAlter_Click(object sender, RoutedEventArgs e) {
  ((Person)lstPersonen.SelectedItem).Alter = 69;
}     



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2010

Visual C# 2010
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2010
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern