{RelativeSource}-Markuperweiterung

Stellt eine Methode bereit, um die Quelle einer Bindung als relative Beziehung im Laufzeitobjektdiagramm anzugeben.

Verwendung von XAML-Attributen (Self-Modus)

<Binding RelativeSource="{RelativeSource Self}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource Self} ...}" .../>

Verwendung von XAML-Attributen (TemplatedParent-Modus)

<Binding RelativeSource="{RelativeSource TemplatedParent}" .../>
-or-
<object property="{Binding RelativeSource={RelativeSource TemplatedParent} ...}" .../>

XAML-Werte

Begriff BESCHREIBUNG
{RelativeSource Self} Erzeugt den Mode-Wert Self. Das Zielelement sollte als Quelle für diese Bindung verwendet werden. Dies ist nützlich, wenn eine Eigenschaft eines Elements an eine andere Eigenschaft im gleichen Element gebunden werden soll.
{RelativeSource TemplatedParent} Erzeugt eine ControlTemplate, die als Quelle für diese Bindung angewendet wird. Dies ist nützlich, wenn Laufzeitinformationen in Bindungen auf Vorlagenebene angewendet werden sollen.

Hinweise

Mit einer Bindung kann Binding.RelativeSource entweder als Attribut für ein Binding-Objektelement oder als Komponente in einer {Binding}-Markuperweiterung festgelegt werden. Aus diesem Grund werden zwei verschiedene Varianten der XAML-Syntax dargestellt.

RelativeSource ähnelt der {Binding}-Markuperweiterung. Hierbei handelt es sich um eine Markuperweiterung, die Instanzen selbstständig zurückgeben kann und die eine zeichenfolgenbasierte Konstruktion unterstützt, die im Wesentlichen ein Argument an den Konstruktor übergibt. In diesem Fall ist das Argument, das übergeben wird, der Mode-Wert.

Der Self-Modus ist nützlich, wenn eine Eigenschaft eines Elements an eine andere Eigenschaft im gleichen Element gebunden werden soll. Dies stellt außerdem eine Variation der ElementName-Bindung dar, erfordert aber keine Benennung und keinen anschließenden Selbstverweis des Elements. Wenn Sie eine Eigenschaft eines Elements an eine andere Eigenschaft im gleichen Element binden, müssen die Eigenschaften den gleichen Eigenschaftentyp ausweisen. Andernfalls müssen Sie auch einen Converter für die Bindung verwenden, um die Werte zu konvertieren. Sie können beispielsweise Height als Quelle für Width ohne Konvertierung verwenden. Sie benötigen jedoch einen Konverter, um IsEnabled als Quelle für Visibility zu nutzen.

Hier sehen Sie ein Beispiel. Dieses Rechteck verwendet eine {Binding}-Markuperweiterung, damit Height und Width immer gleich sind und eine Darstellung als Quadrat erfolgt. Nur die Höhe wird als fester Wert festgelegt. Der standardmäßige DataContext dieses Rechtecks ist null anstelle von this. Daher verwenden wir das RelativeSource={RelativeSource Self}-Argument in der Syntax der {Binding}-Markuperweiterung, um die Datenkontextquelle auf das eigentliche Objekt festzulegen (und die Bindung an ihre anderen Eigenschaften zu ermöglichen).

<Rectangle
  Fill="Orange" Width="200"
  Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
/>

Darüber hinaus kann RelativeSource={RelativeSource Self} auch verwendet werden, um den DataContext eines Objekts auf sich selbst festzulegen. Diese Technik wird beispielsweise in einigen SDK-Beispielen angezeigt, in denen die Page-Klasse um eine benutzerdefinierte Eigenschaft erweitert wurde, die bereits ein einsatzbereites Ansichtsmodell für eine eigene Datenbindung bereitstellt, z. B.: <common:LayoutAwarePage ... DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}">

Hinweis Die XAML-Verwendung für RelativeSource zeigt nur die Verwendung an, für die sie vorgesehen ist: Festlegen eines Werts für Binding.RelativeSource in XAML als Teil eines Bindungsausdrucks. Theoretisch sind andere Verwendungen möglich, wenn Sie eine Eigenschaft mit einem RelativeSource-Wert festlegen.