Die Beherrschung dynamisch aktualisierter Steuerelemente und die Erzeugung eines einheitlichen Designs schaffen professionelle Anwendungen, deren Funktio-nalität durch Kommandos leichter zu organisieren ist.
22 Konzepte von WPF
22.1 Abhängige und angehängte Eigenschaften 

WPF erweitert die Eigenschaften der Common Language Runtime (CLR) um zwei besondere Gruppen:
- Abhängige Eigenschaften (Dependency Properties)
- Angehängte Eigenschaften (Attached Properties)
Beide werden ähnlich wie »normale« Eigenschaften verwendet, aber anders deklariert.
22.1.1 Abhängige Eigenschaften 

Stellen Sie sich vor, im Auslieferungslager eines Unternehmens befindet sich der Artikel A. Mit dem Artikel ist ein bestimmter Verkaufspreis verknüpft. Wird der Artikel ins Ausland verkauft, in dem eine andere Währung Zahlungsmittel ist, muss der Verkaufspreis dynamisch an den aktuellen Wechselkurs angepasst werden. Damit ist der Verkaufspreis eine abhängige Eigenschaft.
Abhängige Eigenschaften haben gegenüber herkömmlichen Eigenschaften einige Vorteile:
- Die Werte werden automatisch aktualisiert.
- Zur Signalisierung von Wertänderungen werden Callback-Methoden verwendet.
- Es kann eine interne Validierung erfolgen.
- Es können Standardwerte definiert werden.
Die Einführung von abhängigen Eigenschaften war notwendig, um die vielen WPF-Features realisieren zu können, da einige davon abhängen, ob sich im System oder in der Anwendung Eigenschaftswerte verändert haben. Zu den Features, die grundlegend auf abhängige Eigenschaften angewiesen sind, gehören beispielsweise die Datenbindung und Animationen.
Das folgende Beispiel zeigt die Definition einer abhängigen Eigenschaft. Die Klasse Linie ist von DependencyObject abgeleitet.
Class Linie : Inherits DependencyObject
' abhängige Eigenschaft selbst
Public Shared ReadOnly LengthProperty As DependencyProperty
' Registrieren der abhängigen Eigenschaft
Shared Sub New()
Linie.LengthProperty = DependencyProperty.Register( _
"Length", GetType(Integer), GetType(Line), _
New FrameworkPropertyMetadata(10, _
New PropertyChangedCallback(AddressOf Linie.OnLengthChanged)))
End Sub
' Schnittstelle der Eigenschaft nach draußen
Public Property Length() As Integer
Get
Return CType(GetValue(Linie.LengthProperty), Integer)
End Get
Set(ByVal value As Integer)
SetValue(Linie.LengthProperty, value)
End Set
End Property
' Callback-Methode
Private Shared Sub OnLengthChanged(ByVal dpObj As DependencyObject, _
ByVal e As DependencyPropertyChangedEventArgs)
' ...
End Sub
End Class
Abhängige Eigenschaften sind vom Typ DependencyProperty. Sie müssen als öffentliche, klassengebundene Felder definiert werden. Die Verwaltung abhängiger Eigenschaften wird vom WPF-Subsystem übernommen. Aus diesem Grund müssen abhängige Eigenschaften mit der Methode Register registriert werden. Die Methodenparameter sind der Name der Eigenschaft (hier: Length), der Typ der Eigenschaft und die Klasse, die die abhängige Eigenschaft beherbergt. Zudem werden bei der Registrierung ein Standardwert und eine Rückrufmethode festgelegt.
Der Zugriff auf die Eigenschaft erfolgt über GetValue und SetValue, die öffentliche Methoden der Klasse DependencyObject sind. Vor dem ersten Aufruf von SetValue gibt GetValue den Standardwert zurück. Sie dürfen GetValue und SetValue auch direkt benutzen und gar keine Eigenschaft definieren.
Von der Callback-Methode schließlich werden alle Wertänderungen überwacht.
22.1.2 Angehängte Eigenschaften 

In hierarchischen Datenstrukturen besteht eine Beziehung zwischen den verschiedenen Ebenen, zum Beispiel wie ein Container seine Komponenten anordnet. Dies erfordert eine Koordination durch das übergeordnete Element, und die notwendige Information, zum Beispiel der Randabstand, wird im Elternelement gespeichert. Im XAML-Code könnte dies als Liste im Elternelement realisiert sein mit einem Eintrag für jedes Kindelement. Dann müsste aber bei jeder Änderung des Containerinhalts diese Liste manuell mit synchronisiert werden. Eleganter ist die Spezifikation der Eigenschaft im Kindelement unter Angabe des betroffenen Elternelements. Als Nebeneffekt bleibt dieses übersichtlicher.
Diese Spezifikation wird angehängte Eigenschaft (Attached Property) genannt. In WPF sind diese Eigenschaften meistens gleichzeitig abhängige Eigenschaften. In der folgenden Syntax sind die kursiv gesetzten Teile kontextabhängig:
Elternelement.Eigenschaft="Wert" |
Hinweis |
Durch angehängte Eigenschaften haben viele Komponenten mehr Eigenschaften, als aus der Klassendefinition ersichtlich ist. |
Im folgenden Beispiel wird eine TextBox in einem Grid positioniert. Die Eigenschaften Grid.Column und Grid.Row werden der TextBox vom Grid zur Verfügung gestellt.
<Grid>
<TextBox Grid.Column="0" Grid.Row="0" Name="txtText" >Hallo</TextBox>
</Grid>
Sie können die Position der TextBox auch mittels Code festlegen, müssen dann aber die Eigenschaften SetColumn und SetRow des Grid-Controls aufrufen (und nicht der TextBox):
Grid.SetColumn(txtText, 1)
Grid.SetRow(txtText, 2)
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.