RelativeSource-Markuperweiterung

Gibt die Eigenschaften einer RelativeSource-Bindungsquelle an, die innerhalb einer Bindungsmarkuperweiterung 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>

- oder -

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

XAML-Werte

Wert Beschreibung
modeEnumValue Einer der folgenden:

- Das Zeichenfolgentoken Self; entspricht einer RelativeSource, die mit einer auf Self festgelegten Eigenschaft Mode erstellt wurde
- Das Zeichenfolgentoken TemplatedParent; entspricht einer RelativeSource, die mit einer auf TemplatedParent festgelegten Eigenschaft Mode erstellt wurde.
- Das Zeichenfolgentoken PreviousData; entspricht einer RelativeSource, die mit einer auf PreviousData festgelegten Eigenschaft Mode erstellt wurde.
Weitere Informationen über den FindAncestor-Modus finden Sie unten.
FindAncestor Die Tokenzeichenfolge FindAncestor. Bei Verwendung dieses Tokens wird ein Modus aktiviert, in dem eine RelativeSource einen Vorgängertyp und optional eine Vorgängerebene angibt. Dies entspricht einer RelativeSource, die mit einer auf Mode festgelegten FindAncestor-Eigenschaft erstellt 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 bezüglich der übergeordneten 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 vorlagenbasierten übergeordneten Element (der Laufzeitobjektinstanz, in der die Vorlage angewendet wird). In diesem Fall ist TemplateBinding Markup Extension tatsächlich eine Kurznotation für den folgenden Bindungsausdruck: {Binding RelativeSource={RelativeSource TemplatedParent}}. Die Verwendung von TemplateBinding oder {RelativeSource TemplatedParent} ist jeweils nur innerhalb der XAML relevant, die 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 Markup Extension-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 (beispielsweise Koersion) zwischen diesen beiden Eigenschaften vorhanden ist. Obwohl es selten vorkommt, dass für zwei Eigenschaften eines Objekts die Werte buchstäblich identisch (und vom gleichen Typ) sind, können Sie einen Converter-Parameter auch auf eine Bindung mit {RelativeSource Self} anwenden 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>
</ListBox>

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

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.

Weitere Informationen