30
WPF Bindung Element- und Daten-Bindung Element- und Daten-Bindung Dr. Beatrice Amrhein

WPF Bindung - sws.bfh.chamrhein/Skripten/Info2/05.DataBinding.pdf · In XAML wird die Bindung erstellt durch: also zum Beispiel

Embed Size (px)

Citation preview

WPF Bindung

Element- und Daten-BindungElement- und Daten-Bindung

Dr. Beatrice Amrhein

Überblick

� Element-Bindung via Eigenschaften-Editor

� Grenzen des Eigenschaften Editors

� Die C# Klasse Binding

� Bindung an C# Objekte� Bindung an C# Objekte

2Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

EinführungEinführung

3Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Einführung

� Bindungen werden zwischen zwei Elementen definiert.

� Datenquelle �� Datenziel.

� Im Datenziel wird eine oder mehrere Eigenschaften an eine Datenquelle verbunden.

� Die Datenquelle kann

� Die Eigenschaft eines anderen Elements (z. B. eines Steuerelement) � Die Eigenschaft eines anderen Elements (z. B. eines Steuerelement) sein � Element-Bindung.

� Oder eine � Daten-Bindung, das heisst

� die Daten-Quelle ist ein C# Objekt

� eine Auflistung,

� eine Datenbank,

� eine XML-Datei.

� . . . 4

Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Element-Bindung via Element-Bindung via Eigenschaften Editor

5Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Inhalt des Labels an die TextBox binden

<Window x:Class="ueb5.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Einfache Elementbindung" Height="230" Width="300">

<StackPanel>

<Label FontSize="18">Bindungs-Beispiel</Label>

<Label Height="25" Margin="10" FontSize="14" HorizontalAlignment="Center">

</Label>

<TextBox Margin="10,0" Name="textBox1" FontSize="14">

</TextBox></TextBox>

</StackPanel>

</Window>

6Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Den Fokus auf das «leere» Label setzen

Inhalt des Labels an die TextBox binden

Im Eigenschaftenfenster von Label die kleine Box rechts von «Content» auswählen.

7Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Menu-Punkt«Datenbindung erstellen»auswählen

Inhalt des Labels an die TextBox binden

Datenquelle ElementName auswählen

Element textBox1 auswählen

(vgl. Name im XAML - Code !)

8Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

XAML - Code !)

Inhalt des Labels an die TextBox binden

Pfad Text auswählen

9Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Mit OK bestätigen

Inhalt des Labels an die TextBox binden

<Window x:Class="ueb5.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Einfache Elementbindung" Height="230" Width="300">

<StackPanel>

<Label FontSize="18">Bindungs-Beispiel</Label>

<Label Height="25" Margin="10" FontSize="14" HorizontalAlignment="Center"

Content="{Binding Text, ElementName=textBox1}">

</Label>

<TextBox Margin="10,0" Name="textBox1" FontSize="14"><TextBox Margin="10,0" Name="textBox1" FontSize="14">

</TextBox>

</StackPanel>

</Window>

10Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Natürlich ist es auch möglich, diese

Element-Bindung (viel schneller) von

Hand zu schreiben.

Das Resultat

<Window x:Class="ueb5.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Einfache Elementbindung" Height="230" Width="300">

<StackPanel>

<Label FontSize="18">Bindungs-Beispiel</Label>

<Label Height="25" Margin="10" FontSize="14" HorizontalAlignment="Center">

<Binding ElementName="textBox1" Path="Text"/>

</Label>

<TextBox Margin="10,0" Name="textBox1" FontSize="14"><TextBox Margin="10,0" Name="textBox1" FontSize="14">

</TextBox>

</StackPanel>

</Window>

11Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Beim Selber-Schreiben, bietet es sich

an, die einfachere Element-Notation

zu verwenden.

Label an ListBoxLabel an ListBoxbinden

12Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Ausgangspunkt

<Window x:Class="ueb5.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Einfache Elementbindung" Height="230" Width="300">

<StackPanel>

<Label Height="25" Margin="10" FontSize="14" HorizontalAlignment="Center">

</Label>

<ListBox Margin="10,0" Name="listBox1" FontSize="14">

<ListBoxItem>Andrea</ListBoxItem>

<ListBoxItem>Benno</ListBoxItem><ListBoxItem>Benno</ListBoxItem>

<ListBoxItem>Corinne</ListBoxItem>

<ListBoxItem>David</ListBoxItem>

<ListBoxItem>Eva</ListBoxItem>

<ListBoxItem>Felix</ListBoxItem>

<ListBoxItem>Gabi</ListBoxItem>

<ListBoxItem>Hannes</ListBoxItem>

</ListBox>

</StackPanel>

</Window>

13Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die Verknüpfung mit einer

Auswahl-Liste wird vom

Editor nur teilweise

unterstützt.

Eigenschaften-Editor

<Window x:Class="ueb5.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Einfache Elementbindung" Height="230" Width="300">

<StackPanel>

<Label Height="25" Margin="10" FontSize="14" HorizontalAlignment="Center">

</Label>

<ListBox Margin="10,0" Name="listBox1" FontSize="14">

<ListBoxItem>Andrea</ListBoxItem>

<ListBoxItem>Benno</ListBoxItem><ListBoxItem>Benno</ListBoxItem>

<ListBoxItem>Corinne</ListBoxItem>

<ListBoxItem>David</ListBoxItem>

<ListBoxItem>Eva</ListBoxItem>

<ListBoxItem>Felix</ListBoxItem>

<ListBoxItem>Gabi</ListBoxItem>

<ListBoxItem>Hannes</ListBoxItem>

</ListBox>

</StackPanel>

</Window>

14Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die Verknüpfung mir einer

Auswahl-Liste wird vom

Editor nur teilweise

unterstützt.

Was der Eigenschaften-Editor erzeugt

<Window x:Class="ueb5.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Einfache Elementbindung" Height="230" Width="300">

<StackPanel>

<Label Height="25" Margin="10" FontSize="14" HorizontalAlignment="Center"

Content="{Binding SelectedItem, ElementName=listBox1}">

</Label>

<ListBox Margin="10,0" Name="listBox1" FontSize="14">

<ListBoxItem>Andrea</ListBoxItem><ListBoxItem>Andrea</ListBoxItem>

<ListBoxItem>Benno</ListBoxItem>

<ListBoxItem>Corinne</ListBoxItem>

<ListBoxItem>David</ListBoxItem>

<ListBoxItem>Eva</ListBoxItem>

<ListBoxItem>Felix</ListBoxItem>

<ListBoxItem>Gabi</ListBoxItem>

<ListBoxItem>Hannes</ListBoxItem>

</ListBox>

</StackPanel>

</Window>

15Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Der erzeugte Code ist

nicht vollständig und muss

von Hand ergänzt

werden.

.Content ergänzen

<Window x:Class="ueb5.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Einfache Elementbindung" Height="230" Width="300">

<StackPanel>

<Label Height="25" Margin="10" FontSize="14" HorizontalAlignment="Center"

Content="{Binding SelectedItem.Content, ElementName=listBox1}">

</Label>

<ListBox Margin="10,0" Name="listBox1" FontSize="14">

<ListBoxItem>Andrea</ListBoxItem><ListBoxItem>Andrea</ListBoxItem>

<ListBoxItem>Benno</ListBoxItem>

<ListBoxItem>Corinne</ListBoxItem>

<ListBoxItem>David</ListBoxItem>

<ListBoxItem>Eva</ListBoxItem>

<ListBoxItem>Felix</ListBoxItem>

<ListBoxItem>Gabi</ListBoxItem>

<ListBoxItem>Hannes</ListBoxItem>

</ListBox>

</StackPanel>

</Window>

16Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Element Schreibweise

<Window x:Class="ueb5.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Einfache Elementbindung" Height="230" Width="300">

<StackPanel>

<Label Height="25" Margin="10" FontSize="14" HorizontalAlignment="Center">

<Binding ElementName="listBox1" Path="SelectedItem.Content"/>

</Label>

<ListBox Margin="10,0" Name="listBox1" FontSize="14">

<ListBoxItem>Andrea</ListBoxItem><ListBoxItem>Andrea</ListBoxItem>

<ListBoxItem>Benno</ListBoxItem>

<ListBoxItem>Corinne</ListBoxItem>

<ListBoxItem>David</ListBoxItem>

<ListBoxItem>Eva</ListBoxItem>

<ListBoxItem>Felix</ListBoxItem>

<ListBoxItem>Gabi</ListBoxItem>

<ListBoxItem>Hannes</ListBoxItem>

</ListBox>

</StackPanel>

</Window>

17Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Auch hier bietet es sich an,

die einfachere Notation zu

verwenden.

Beispiel 2: Bindung via C# Code

namespace ueb5

{

public partial class MainWindow : Window

{

public MainWindow()

{

InitializeComponent();

Binding binding = new Binding("SelectedItem.Content");

binding.ElementName = "listBox1";binding.ElementName = "listBox1";

label.SetBinding(Label.ContentProperty, binding);

}

}

}

18Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Statt im XAML-Code kann die

Datenbindung auch im C#

Code definiert werden.

Daten-Bindung

Die C# Klasse Binding

19

Die Klasse Binding

� Dient als Verbindung zwischen

− Ziel-Objekten (normalerweise WPF-Elemente) und

− einer Datenquelle (z. B. eine Datenbank, eine XML-Datei oder ein beliebiges Objekt mit Daten)

20Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Bindung

Die Klasse Binding

Bindung

21Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Eine Bindung besteht aus einem Bindungsziel, (mit einer Abhängigkeits-Eigenschaft), einer Bindungsquelle sowie dem Pfad zum konkreten Wert in der Bindungsquelle. Diese kann im XAML oder im C# Code erzeugt werden.

In XAML wird die Bindung erstellt durch: <Binding .../>also zum Beispiel <Binding ElementName=" . . . " Path=" . . . "/>

In C# wird ein Bindungsobjekt durch einen Konstruktor erzeugtBinding b = new Binding(. . .).

Die Eigenschaften der C# Klasse Binding

ElementNameGibt den Namen des Steuerelements (vom GUI) an, welches als Datenquelle dient.

PathPath ist die Eigenschaft (Property) an welche die Daten gebunden werden (Value, Text, Content, …)

ModeDefiniert den Bindungsmodus (Aktualisierungsmodus) fest. Dieser kann einseitig (OneWay) oder beidseitig (TwoWay) zwischen GUI Mode kann einseitig (OneWay) oder beidseitig (TwoWay) zwischen GUI und Datenobjekt sein. Default ist TwoWay.

ConverterGibt das Objekt an, welche als Converter (Übersetzer) verwendet werden soll.

Source Legt das Objekt fest, welches als Quelle der Datenbindung dient.

UpdateSourceTriggerDefiniert, wann die Datenquelle aktualisiert werden soll (z.B. jedesmal wenn sich die die Daten ändern).

22Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Datenbindung an C# Datenbindung an C# Person Objekt

23Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die Daten-Quelle: Die Klasse Person

public class Person

{

private String name;

private int idNummer;

public Person(String n, int id)

{

this.name = n;

this.idNummer = id;

}

Die Klasse Person, mit Name und IDNummer.

Konstruktor

public String Name

{

get { return name; }

set { name = value; }

}

public int IDNummer

{

get { return idNummer; }

set { idNummer = value; }

}

}

24Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Zugriffsmethoden (get/set) für alle Eigenschaften (Properties)

Erstellen des Person Objekts und setzen als Datenquelle

// MainWindow.xaml.cs

using System.Windows;

namespace bindung

{

public partial class MainWindow : Window

{

public Person p = new Person("Meier", 2423);

public MainWindow()Person p ist die

public MainWindow()

{

InitializeComponent();

DataContext = p;

}

}

}

25Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Person p ist die Datenquelle für die XAML-Seite

Verbindung (Binding) im XAML Code

<DockPanel Width="230">

<Label DockPanel.Dock="Top" Width="190">Personen-Angaben</Label>

<Button Content="OK" DockPanel.Dock="Bottom" Margin="50,5"/>

<UniformGrid Columns="2" Height="80">

<Label>Name</Label>

<TextBox >

<Binding Path="Name" Mode="TwoWay"/>

</TextBox>

<Label>ID-Nummer</Label>

<TextBox>

<Binding Path="IDNummer" Mode="TwoWay"/>

Zweiseitige Datenbindung (lesen und schreiben)

<Binding Path="IDNummer" Mode="TwoWay"/>

</TextBox>

<Label>

<Binding Path="Name" Mode="OneWay"/>

</Label>

<Label>

<Binding Path="IDNummer" Mode="OneWay"/>

</Label>

</UniformGrid>

</DockPanel>

26Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Da das Person Objekt die Datenquelle ist, kann direkt auf die Eigenschaften (Properties) Name und IDNummer von Person zugegriffen werden.

Datenbindung für das Einschreibe-Formular

27Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Einschreibe-Formular

Die Klasse Einschreibung

public class Einschreibung

{

private String name;

private String vorname;

private String fach;

private int semester;

public String Name

{

get { return name; }

set { name = value; }

Jedes Feld des Formulars erhält hier eine Eigenschaft (eine Property).

set { name = value; }

}

. . . .

public int Semester

{

get { return semester; }

set {semester = value; }

}

}

28Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Für jede Property müssen die Zugriffsmethoden (get/set) implementiert werden.

Die Klasse Einschreibung

public partial class MainWindow : Window

{

Einschreibung einschreibung =

new Einschreibung("Muster", "Peter", "Maschinentechnik",2);

public MainWindow()

{

InitializeComponent();

einschreibung erzeugen

einschreibung als Datenquelle InitializeComponent();

DataContext = einschreibung;

}

}

29Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Datenquelle festlegen.

Der XAML Code

<DockPanel>

<Label DockPanel.Dock="Top" Content="Anmeldung" FontSize="20" Margin="20"/>

<UniformGrid DockPanel.Dock="Bottom Rows="1" Margin="40,5">

<Button Content="Abbrechen" Margin="5" Width="80" IsCancel="True"/>

<Button Content="Speichern" Margin="5" Width="98" IsDefault="True"/>

</UniformGrid>

<Grid Width="300">

. . . Labels definieren . . .

<StackPanel Grid.Row="0" Grid.Column="1">

<TextBox Width="173" Margin="2">

einschreibung /DataContextim Fenster benutzen

<TextBox Width="173" Margin="2">

<Binding Path="Name" Mode="TwoWay"/>

</TextBox>

<TextBox Width="173" Margin="2">

<Binding Path="Vorname" Mode="TwoWay"/>

</TextBox>

<TextBox Width="173" Margin="2">

<Binding Path="Fach" Mode="TwoWay"/>

</TextBox>

. . .

</DockPanel>

30Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012