Freigeben über


RelativeSource MarkupExtension

Gibt die Eigenschaften einer RelativeSource Bindungsquelle an, die in einer Bindungsmarkuperweiterung verwendet werden soll, oder wenn die RelativeSource Eigenschaft eines Binding Elements, das in XAML eingerichtet ist, festgelegt wird.

Verwendung von XAML-Attributen

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

XAML-Attributverwendung (geschachtelt innerhalb der Binding-Erweiterung)

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

XAML-Objektelementverwendung

<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 Eins der folgenden:

- Das Zeichenfolgentoken Self entspricht einem RelativeSource, das mit der Eigenschaft Mode auf Self gesetzt erstellt wurde.
- Das Zeichenfolgentoken TemplatedParent entspricht einem RelativeSource, das mit der Eigenschaft Mode auf TemplatedParent gesetzt erstellt wurde.
- Das Zeichenfolgentoken PreviousData entspricht einem RelativeSource, das mit der Eigenschaft Mode auf PreviousData gesetzt erstellt wurde.
- Informationen zum FindAncestor Modus finden Sie unten.
FindAncestor Das String-Token FindAncestor. Die Verwendung dieses Tokens wechselt in einen Modus, in dem ein RelativeSource Vorfahrentyp und optional eine Vorfahrenebene angegeben wird. Dies entspricht einem RelativeSource, das mit seiner Mode Eigenschaft auf FindAncestor gesetzt wurde.
typeName Erforderlich für FindAncestor Modus. Der Name eines Typs, der die AncestorType Eigenschaft ausfüllt.
intLevel Optional für FindAncestor Modus. Eine Vorgängerebene (ausgewertet in Richtung der übergeordneten Richtung in der logischen Struktur).

Bemerkungen

{RelativeSource TemplatedParent} Bindungsverwendungen sind eine schlüsseltechnische Methode, die ein größeres Konzept der Trennung der Benutzeroberfläche eines Steuerelements und der Logik eines Steuerelements behandelt. Dies ermöglicht die Bindung innerhalb der Vorlagendefinition an das übergeordnete Vorlagenobjekt (die Laufzeitobjektinstanz, auf die die Vorlage angewendet wird). In diesem Fall ist die TemplateBinding-Markuperweiterung tatsächlich eine Kurzform für den folgenden Bindungsausdruck: {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBinding oder {RelativeSource TemplatedParent} Verwendung ist nur im XAML-Code relevant, der eine Vorlage definiert. Weitere Informationen finden Sie unter TemplateBinding Markup Extension.

{RelativeSource FindAncestor} wird hauptsächlich in Steuervorlagen oder vorhersehbaren und eigenständigen UI-Kompositionen verwendet, für Fälle, in denen ein Steuerelement immer in einer visuellen Baumstruktur eines bestimmten übergeordneten Typs erwartet wird. Beispielsweise können Elemente eines Elemente-Steuerelements FindAncestor-Verwendungen zum Binden an Eigenschaften des übergeordneten Eltern-Steuerelements verwenden. Oder Elemente, die Teil der Steuerelementkomposition in einer Vorlage sind, können Bindungen an die übergeordneten Elemente in derselben Kompositionsstruktur verwenden FindAncestor .

In der Objektelementsyntax für FindAncestor den Modus, der in den XAML-Syntaxabschnitten angezeigt wird, wird die zweite Objektelementsyntax speziell für FindAncestor den Modus verwendet. Für den Modus FindAncestor ist ein Wert AncestorType erforderlich. Sie müssen AncestorType als ein Attribut festlegen, indem Sie einen x:Type Markup Extension-Verweis auf den Typ des Vorgängers verwenden, nach dem gesucht werden soll. Der AncestorType Wert wird verwendet, wenn die Bindungsanfrage während der Ausführungszeit verarbeitet wird.

Für den Modus FindAncestor kann die optionale Eigenschaft AncestorLevel dazu beitragen, die Suche nach einem Vorgänger zu unterscheiden, in Fällen, in denen möglicherweise mehr als ein Vorgänger dieses Typs im Elementbaum vorhanden ist.

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

{RelativeSource Self} ist nützlich für Szenarien, in denen eine Eigenschaft einer Instanz vom Wert einer anderen Eigenschaft derselben Instanz abhängen sollte, und es gibt keine allgemeine Abhängigkeitseigenschaftsbeziehung (z. B. Koersion) zwischen diesen beiden Eigenschaften. Obwohl es selten ist, dass zwei Eigenschaften für ein Objekt vorhanden sind, sodass die Werte buchstäblich identisch sind (und identisch typiert sind), können Sie auch einen Converter Parameter auf eine Bindung anwenden, die über {RelativeSource Self}den Konverter verfügt, und den Konverter verwenden, um zwischen Quell- und Zieltypen zu konvertieren. Ein weiteres Szenario für {RelativeSource Self} ist als Teil eines MultiDataTrigger.

Beispielsweise definiert der folgende XAML-Code ein Rectangle Element so, dass unabhängig vom eingegebenen Wert WidthRectangle immer ein Quadrat ist:<Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} ist entweder in Datenvorlagen hilfreich oder in Fällen, in denen Bindungen eine Sammlung als Datenquelle verwenden. Sie können {RelativeSource PreviousData} verwenden, um Beziehungen zwischen benachbarten Datenelementen in der Sammlung hervorzuheben. Eine verwandte Technik besteht darin, eine MultiBinding zwischen den aktuellen und vorherigen Elementen in der Datenquelle herzustellen und einen Konverter für diese Bindung zu verwenden, um den Unterschied zwischen den beiden Elementen und ihren Eigenschaften zu bestimmen.

Im folgenden Beispiel zeigt die erste TextBlock in der Vorlage der Elemente die aktuelle Zahl an. Die zweite TextBlock Bindung ist eine MultiBinding , die nominal zwei Binding Bestandteile aufweist: den aktuellen Datensatz und eine Bindung, die absichtlich den vorherigen Datensatz verwendet {RelativeSource PreviousData}. Anschließend berechnet ein Konverter auf der MultiBinding die Differenz und gibt sie 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>

Die Beschreibung der Datenbindung als Konzept wird hier nicht behandelt, siehe Data Binding Overview.

In der WPF-XAML-Prozessorimplementierung wird die Behandlung dieser Markup-Erweiterung durch die RelativeSource-Klasse definiert.

RelativeSource ist eine Markup-Erweiterung. Markuperweiterungen werden typischerweise implementiert, wenn Attributwerte von den reinen Literalwerten oder Handlernamen abweichen müssen und diese Anforderung globaler ist, als nur Typkonverter für bestimmte Typen oder Eigenschaften zu verwenden. Alle Markuperweiterungen in XAML verwenden die zeichen { und } in ihrer Attributsyntax. Dies ist die Konvention, mit der ein XAML-Prozessor erkennt, dass eine Markuperweiterung das Attribut verarbeiten muss. Weitere Informationen finden Sie unter Markuperweiterungen und WPF-XAML.

Siehe auch