26.5 Angehängte Eigenschaften (Attached Property)
Angehängte Eigenschaften werden vom Konstrukt her auch als DependencyProperty implementiert, zeigen aber eine andere Verhaltensweise. Angehängte Eigenschaften werden nämlich nicht im Objekt selbst abgelegt, sondern in den Objekten anderer Klassen. Dies wird insbesondere bei den Layout-Containern praktiziert, wenn eine Abhängigkeitseigenschaft vom Layout-Container an das untergeordnete Element weitergegeben wird.
Das folgende Codefragment zeigt einen typischen Einsatzfall. Innerhalb eines Grid-Steuerelements ist eine Schaltfläche in der zweiten Zeile und der zweiten Spalte des Grid platziert.
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Name="btnButton" Grid.Column="1" Grid.Row="1" />
</Grid>
Listing 26.16 Typischer Einsatz einer angehängten Eigenschaft
Um den Button passend zu positionieren, wird den beiden angehängten Eigenschaften Grid.Column und Grid.Row der entsprechende Spalten- und Zeilenindex übergeben. Grid.Column und Grid.Row sind keine Eigenschaften der Schaltfläche, sondern werden der Schaltfläche durch das Grid-Objekt hinzugefügt.
Wir wollen uns das Konzept der angehängten Eigenschaften am Beispiel der Grid.Column-Eigenschaft ansehen.
public class Grid : DependencyObject {
public static readonly DependencyProperty ColumnProperty;
static Grid() {
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(0);
Grid.ColumnProperty = DependencyProperty.RegisterAttached("Column",
typeof(int), typeof(Grid), metadata);
}
public static int GetColumn(UIElement element) {
if (element == null) throw new ArgumentNullException();
return (int)element.GetValue(Grid.ColumnProperty);
}
public static void SetColumn(UIElement element, int value)
{
if (element == null) throw new ArgumentNullException();
element.SetValue(Grid.ColumnProperty, value);
}
}
Listing 26.17 Definition der angehängten Eigenschaft »Grid.Column«
Der Code soll keinen Anspruch auf Vollständigkeit erheben. Beispielsweise zeigt er keinerlei Validierungen, um eine gültige Indexposition zu gewährleisten.
Eine angehängte Eigenschaft zu definieren ähnelt der Definition einer Abhängigkeitseigenschaft. Allerdings wird eine angehängte Eigenschaft mit der Methode RegisterAttach beim WPF-Subsystem registriert. Ein FrameworkPropertyMetadata-Objekt sorgt auch hier für individuelle Einstellungen der angehängten Eigenschaft.
Angehängte Eigenschaften weisen keinen Eigenschaftswrapper auf. Stattdessen werden zwei statische Methoden bereitgestellt, um den Eigenschaftswert zu setzen bzw. auszuwerten. Die Methodenbezeichner sollten dem Muster Set<Eigenschaftsname> und Get<Eigenschaftsname> folgen. Intern rufen die beiden Methoden die von DependencyObject geerbten Methoden SetValue und GetValue auf.
Visual Studio 2012 bietet auch für angehängte Eigenschaften ein Code-Snippet an, um
das Grundgerüst einer Attached Property zu erstellen. Geben Sie dazu einfach in der
Klasse propa ein, und drücken Sie anschließend die -Taste.
26.5.1 Angehängte Eigenschaften zur Laufzeit ändern
Zur Festlegung eines Wertes im XAML-Code sind die Eigenschaften SetColumn bzw. SetRow eines Grid-Steuerelements nicht geeignet. Sie lassen sich aber dazu benutzen, um mit C#-Code zur Laufzeit einen neuen Wert zu setzen. Soll der zu Beginn dieses Abschnitts gezeigte Button beispielsweise von der Zeile mit dem Index 1 in die Zeile mit dem Index 0 verschoben werden, genügt die folgende Anweisung:
btnButton.SetValue(Grid.RowProperty, 0);
Listing 26.18 Ändern einer angehängten Eigenschaft
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.