Share via


RelativeSource-Markuperweiterung

Gibt die Eigenschaften einer RelativeSource-Bindungsquelle an, die innerhalb einer Bindung als Markuperweiterung oder beim Festlegen der RelativeSource-Eigenschaft eines in XAML eingerichteten Binding-Elements verwendet werden soll.

Verwendung von XAML-Attributen

<Binding RelativeSource="{RelativeSource modeEnumValue}" .../>

XAML-Attributverwendung (geschachtelt innerhalb der Bindungserweiterung)

<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" .../>

Verwendung von XAML-Objektelementen

<Binding>
  <Binding.RelativeSource>
    <RelativeSource Mode="modeEnumValue"/>
  </Binding.RelativeSource>
</Binding>
- or 
<Binding>
  <Binding.RelativeSource>
    <RelativeSource
      Mode="FindAncestor"
      AncestorType="{x:Type typeName}"
      AncestorLevel="intLevel"
    />
  </Binding.RelativeSource>
</Binding>

XAML-Werte

modeEnumValue

Eine der folgenden Anwendungen:

  • Das Zeichenfolgentoken Self; entspricht einer RelativeSource, wie diese erstellt wurde, wenn für ihre Mode-Eigenschaft Self festgelegt wurde.

  • Das Zeichenfolgentoken TemplatedParent; entspricht einer RelativeSource, wie diese erstellt wurde, wenn für ihre Mode-Eigenschaft TemplatedParent festgelegt wurde.

  • Das Zeichenfolgentoken PreviousData; entspricht einer RelativeSource, wie diese erstellt wurde, wenn für ihre Mode-Eigenschaft PreviousData festgelegt wurde.

  • Weitere Informationen über den FindAncestor-Modus finden Sie unten.

FindAncestor

Das Zeichenfolgentoken FindAncestor. Bei Verwendung dieses Tokens wird ein Modus aktiviert, der eine RelativeSource als Vorgängertyp und optional eine Vorgängerebene angibt. Dies entspricht einer RelativeSource, wie diese erstellt wurde, wenn für ihre Mode-Eigenschaft FindAncestor festgelegt wurde.

typeName

Erforderlich für FindAncestor-Modus. Der Name eines Typs, der die AncestorType-Eigenschaft auffüllt.

intLevel

Optional für FindAncestor-Modus. Eine Vorgängerebene (ausgewertet gegen die übergeordnete Richtung in der logischen Struktur).

Hinweise

{RelativeSource TemplatedParent}-Bindungsverwendungen sind eine wichtige Technik für ein größeres Konzept der Trennung von Benutzeroberfläche und Logik eines Steuerelements. Dies ermöglicht die Bindung aus der Vorlagendefinition mit dem auf Vorlagen basierenden übergeordneten Element (Laufzeitobjektinstanz, in der die Vorlage angewendet wird). In diesem Fall ist TemplateBinding-Markuperweiterung tatsächlich eine Kurznotation für den folgenden Bindungsausdruck: {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBinding- oder {RelativeSource TemplatedParent}-Verwendung sind jeweils nur innerhalb von XAML relevant, das eine Vorlage definiert. Weitere Informationen finden Sie unter TemplateBinding-Markuperweiterung.

{RelativeSource FindAncestor} wird hauptsächlich in Steuerelementvorlagen oder vorhersagbaren unabhängigen Benutzeroberflächenzusammensetzungen für Fälle verwendet, in denen ein Steuerelement immer in einer visuellen Struktur eines bestimmten Vorgängertyps erwartet wird. Beispielsweise können Elemente eines Elementsteuerelements FindAncestor-Verwendungen zum Binden an Eigenschaften des übergeordneten Vorgängers des Elementsteuerelements verwenden. Oder Elemente, die Teil der Steuerelementzusammensetzung in einer Vorlage sind, können FindAncestor-Bindungen mit übergeordneten Elemente in derselben Kompositionsstruktur verwenden.

In der Objektelementsyntax für den FindAncestor-Modus, wie in den XAML-Syntaxabschnitten dargestellt, wird die zweite Objektelementsyntax speziell für den FindAncestor-Modus verwendet. Der FindAncestor-Modus erfordert einen AncestorType-Wert. Sie müssen AncestorType als Attribut festlegen, unter Verwendung eines x:Type-Markuperweiterung-Verweises auf den Vorgängertyp, nach dem gesucht werden soll. Der AncestorType-Wert wird verwendet, wenn die Bindungsanforderung zur Laufzeit verarbeitet wird.

Im FindAncestor-Modus kann die optionale Eigenschaft AncestorLevel dazu beitragen, die Vorgängersuche in den Fällen eindeutig zu machen, in denen eventuell mehr als ein Vorgänger dieses Typs in der Elementstruktur vorhanden ist.

Weitere Informationen zur Verwendung des FindAncestor-Modus finden Sie unter RelativeSource.

{RelativeSource Self} ist für Szenarien nützlich, in denen eine Eigenschaft einer Instanz vom Wert einer anderen Eigenschaft derselben Instanz abhängen soll und noch kein allgemeines Abhängigkeitseigenschaftenverhältnis (z. B. Koersion) zwischen diesen beiden Eigenschaften vorhanden ist. Obwohl es selten vorkommt, dass zwei Eigenschaften in einem Objekts so vorhanden sein, dass die Werte identisch sind (und identisch typisiert werden), können Sie einen Converter-Parameter auch auf eine Bindung anwenden, die {RelativeSource Self} enthält, und mit dem Konverter zwischen Quell- und Zieltypen konvertieren. Ein anderes Szenario für {RelativeSource Self} ist Teil von MultiDataTrigger.

Beispielsweise definiert der folgende XAML-Code ein Rectangle-Element so, dass unabhängig davon, welcher Wert für Width eingegeben wird, Rectangle immer ein Quadrat ist: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} ist entweder in Datenvorlagen oder in Fällen hilfreich, in denen Bindungen eine Auflistung als Datenquelle verwenden. Sie können {RelativeSource PreviousData} verwenden, um Beziehungen zwischen angrenzenden Datenelementen in der Auflistung hervorzuheben. Eine verwandte Methode besteht darin, eine MultiBinding zwischen dem aktuellen und vorherigen Element in der Datenquelle herzustellen und mit einem Konverter für diese Bindung die Differenz zwischen den beiden Elementen und deren Eigenschaften zu ermitteln.

Im folgenden Beispiel zeigt der erste TextBlock in der Elementvorlage die aktuelle Zahl an. Die zweite TextBlock-Bindung ist eine MultiBinding, die nominell zwei Binding-Bestandteile besitzt: den aktuellen Datensatz und eine Bindung, die absichtlich den vorherigen Datensatz mithilfe von {RelativeSource PreviousData} verwendet. Anschließend berechnet ein Konverter in der MultiBinding den Unterschied und gibt ihn an die Bindung zurück.

        <ListBox Name="fibolist">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding}"/>
                    <TextBlock>, difference = </TextBlock>
                        <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding Converter="{StaticResource DiffConverter}">
                                    <Binding/>
                                    <Binding RelativeSource="{RelativeSource PreviousData}"/>
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </StackPanel>
                    </DataTemplate>
            </ListBox.ItemTemplate>

Das Konzept der Datenbindung wird hier nicht erläutert. Informationen hierzu finden Sie unter Übersicht über Datenbindung.

In der WPF-XAML-Prozessorimplementierung wird die Handhabung dieser Markuperweiterung durch die RelativeSource-Klasse definiert.

RelativeSource ist eine Markuperweiterung. Markuperweiterungen werden in der Regel implementiert, wenn Attributwerte mit Escapezeichen versehen werden müssen, damit diese nicht als literale Werte oder als Handlernamen betrachtet werden, und diese Anforderung eher global und nicht nur durch den Einsatz von Typkonvertern für bestimmte Typen oder Eigenschaften erfüllt werden soll. Alle Markuperweiterungen in XAML verwenden die Zeichen { und } in der Attributsyntax. Dies ist die Konvention, durch die ein XAML-Prozessor erkennt, dass das Attribut von einer Markuperweiterung verarbeitet werden muss. Weitere Informationen finden Sie unter Markuperweiterungen und WPF-XAML.

Siehe auch

Referenz

Binding

x:Type-Markuperweiterung

Konzepte

Erstellen von Formaten und Vorlagen

Übersicht über XAML (WPF)

Markuperweiterungen und WPF-XAML

Übersicht über Datenbindung

Übersicht über Bindungsdeklarationen