RelativeSource MarkupExtension
Gibt die Eigenschaften einer RelativeSource-Bindungsquelle an, die innerhalb einer -Bindungsauszeichnungserweiterungverwendet oder beim Festlegen der RelativeSource-Eigenschaft eines in XAML definierten Binding-Elements angewendet wird.
XAML-Attributverwendung
<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />
XAML-Attributverwendung (geschachtelt in 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 |
Eine der folgenden: - Das Zeichenfolgentoken Self ; entspricht einer RelativeSource, die erstellt wird, indem ihre Mode-Eigenschaft auf Selfgesetzt wird.- Das String-Token TemplatedParent ; entspricht einem RelativeSource, das mit der Mode-Eigenschaft erstellt wird, die auf TemplatedParentfestgelegt ist.- Das Zeichenfolgentoken PreviousData , entspricht einer RelativeSource, wie sie mit der Mode-Eigenschaft erstellt wurde, die auf PreviousDatafestgelegt ist.– Informationen zum FindAncestor Modus finden Sie unten. |
FindAncestor |
Das String-Token FindAncestor . Die Verwendung dieses Tokens wechselt in einen Modus, in dem ein RelativeSource einen Vorfahrentyp und optional eine Vorfahrenebene angibt. Dies entspricht einem RelativeSource, wie es erstellt wurde mit der Mode-Eigenschaft, die auf FindAncestorfestgelegt ist. |
typeName |
Erforderlich für den FindAncestor -Modus. Der Name eines Typs, der die AncestorType-Eigenschaft ausfüllt. |
intLevel |
Optional im FindAncestor -Modus. Eine Vorgängerebene (bewertet in Richtung der übergeordneten Ebene im logischen Baum). |
Bemerkungen
{RelativeSource TemplatedParent}
Bindungsverwendungen sind eine Schlüsseltechnik, 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 Markup Extension in der Tat eine Kurzform für den folgenden Bindungsausdruck: {Binding RelativeSource={RelativeSource TemplatedParent}}
. TemplateBinding
- oder {RelativeSource TemplatedParent}
-Nutzungen sind beide nur innerhalb des XAML relevant, das eine Vorlage bestimmt. Weitere Informationen finden Sie unter TemplateBinding Markup Extension.
{RelativeSource FindAncestor}
wird hauptsächlich in Steuerelementvorlagen oder vorhersagbaren eigenständigen UI-Kompositionen verwendet, in Fällen, in denen ein Steuerelement immer in einem visuellen Baum eines bestimmten Vorfahrentyps erwartet wird. Beispielsweise können Elemente eines Elementsteuerelements FindAncestor
-Verwendungen nutzen, um an Eigenschaften ihres übergeordneten Steuerelement-Vorfahren zu binden. Oder Elemente, die Teil der Steuerelement-Zusammensetzung in einer Vorlage sind, können mithilfe von FindAncestor
-Bindungen auf die übergeordneten Elemente innerhalb derselben Kompositionsstruktur zugreifen.
In der Objektelementsyntax für den FindAncestor
Modus in den XAML-Syntaxabschnitten wird die zweite Objektelementsyntax speziell für den FindAncestor
Modus verwendet. FindAncestor
Modus erfordert einen AncestorType Wert. Sie müssen AncestorType als Attribut mit einer x:Type Markup Extension Verweis auf den Typ des Vorgängers festlegen, nach dem gesucht werden soll. Der AncestorType Wert wird verwendet, wenn die Bindungsanforderung zur Laufzeit verarbeitet wird.
Für den FindAncestor
-Modus kann die optionale Eigenschaft AncestorLevel dabei helfen, die Vorfahrensuche in Fällen zu klären, in denen möglicherweise 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 nützlich für Szenarien, in denen eine Eigenschaft einer Instanz vom Wert einer anderen Eigenschaft derselben Instanz abhängen sollte, und keine allgemeine Abhängigkeitseigenschaftsbeziehung (z. B. Koersion) zwischen diesen beiden Eigenschaften bereits vorhanden ist. 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 {RelativeSource Self}
hat, 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 davon, welcher Wert für Widtheingegeben wird, die 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 nützlich, 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 Elementvorlage die aktuelle Zahl an. Die zweite TextBlock-Bindung ist eine MultiBinding, die nominell zwei Binding-Bestandteile umfasst: den aktuellen Datensatz und eine Bindung, die den vorherigen Datensatz absichtlich mithilfe von {RelativeSource PreviousData}
verwendet. Anschließend berechnet ein Konverter auf der MultiBinding die Differenz und gibt diese 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 für diese Markuperweiterung durch die RelativeSource-Klasse definiert.
RelativeSource
ist eine Markup-Erweiterung. Markuperweiterungen werden in der Regel implementiert, wenn es erforderlich ist, Attributwerte so zu behandeln, dass sie keine Literalwerte oder Handlernamen sind, und diese Anforderung umfassender ist als nur das Platzieren von Typkonvertern auf bestimmten Typen oder Eigenschaften. 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
.NET Desktop feedback