RelativeSource MarkupExtension
Określa właściwości źródła powiązania RelativeSource, które ma być używane w binding Markup Extension, lub podczas ustawiania właściwości RelativeSource elementu Binding ustanowionego w języku XAML.
Użycie atrybutu XAML
<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />
Użycie atrybutów XAML (zagnieżdżone w rozszerzeniu wiązania)
<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" ... />
Użycie elementu obiektu XAML
<Binding>
<Binding.RelativeSource>
<RelativeSource Mode="modeEnumValue"/>
</Binding.RelativeSource>
</Binding>
-lub-
<Binding>
<Binding.RelativeSource>
<RelativeSource
Mode="FindAncestor"
AncestorType="{x:Type typeName}"
AncestorLevel="intLevel"
/>
</Binding.RelativeSource>
</Binding>
Wartości XAML
Wartość | Opis |
---|---|
modeEnumValue |
Jedną z następujących czynności: - Token ciągu Self ; odpowiada RelativeSource utworzonej za pomocą właściwości Mode ustawionej na wartość Self.- Token ciągu TemplatedParent ; odpowiada RelativeSource utworzonej za pomocą właściwości Mode ustawionej na wartość TemplatedParent.- Token ciągu PreviousData ; odpowiada RelativeSource utworzonej za pomocą właściwości Mode ustawionej na wartość PreviousData.- Zobacz poniżej, aby uzyskać informacje na temat trybu FindAncestor . |
FindAncestor |
Token tekstowy FindAncestor . Użycie tego tokenu powoduje wprowadzenie trybu, w którym RelativeSource określa typ przodka i opcjonalnie poziom przodka. Odpowiada to RelativeSource utworzonej za pomocą właściwości Mode ustawionej na wartość FindAncestor. |
typeName |
Wymagany dla trybu FindAncestor . Nazwa typu, który wypełnia właściwość AncestorType. |
intLevel |
Opcjonalnie dla trybu FindAncestor . Poziom przodka (obliczany względem kierunku rodzicielskiego w drzewie logicznym). |
Uwagi
Zastosowania powiązań {RelativeSource TemplatedParent}
to kluczowa technika, która odnosi się do szerszej koncepcji rozdzielenia interfejsu użytkownika i logiki kontrolki. Umożliwia to powiązanie z definicji szablonu do szablonu nadrzędnego (wystąpienia obiektu czasu wykonywania, w którym jest stosowany szablon). W tym przypadku TemplateBinding Markup Extension jest w rzeczywistości skrótem dla następującego wyrażenia powiązania: {Binding RelativeSource={RelativeSource TemplatedParent}}
.
TemplateBinding
lub {RelativeSource TemplatedParent}
zastosowania są istotne tylko w kontekście XAML definiującego szablon. Aby uzyskać więcej informacji, zobacz TemplateBinding Markup Extension.
{RelativeSource FindAncestor}
jest używana głównie w szablonach kontrolek lub przewidywalnych, samodzielnych i niezależnych kompozycjach interfejsu użytkownika, w przypadkach, gdy oczekuje się, że kontrolka zawsze będzie znajdować się w drzewie wizualnym o określonym typie przodka. Na przykład elementy kontrolki elementów mogą używać etykiet FindAncestor
do powiązania z właściwościami nadrzędnego przodka kontrolki elementów. Albo elementy, które są częścią kompozycji kontroli w szablonie, mogą używać powiązań FindAncestor
z elementami nadrzędnymi w tej samej strukturze kompozycji.
W składni elementu obiektu dla trybu FindAncestor
, pokazanej w sekcjach dotyczących składni XAML, druga składnia elementu obiektu jest używana specjalnie dla trybu FindAncestor
. tryb FindAncestor
wymaga wartości AncestorType. Należy ustawić AncestorType jako atrybut przy użyciu rozszerzenia znaczników x:Type Markup Extension, odwołującego się do typu przodka, którego należy wyszukać. Wartość AncestorType jest używana, gdy żądanie wiązania jest przetwarzane w czasie rzeczywistym.
W przypadku trybu FindAncestor
opcjonalna właściwość AncestorLevel może pomóc w doprecyzowaniu wyszukiwania przodków w przypadkach, gdy w drzewie elementów istnieje prawdopodobnie więcej niż jeden przodek tego typu.
Aby uzyskać więcej informacji na temat korzystania z trybu FindAncestor
, zobacz RelativeSource.
{RelativeSource Self}
jest przydatna w scenariuszach, w których jedna właściwość wystąpienia powinna zależeć od wartości innej właściwości tego samego wystąpienia, a żadna ogólna relacja właściwości zależności (na przykład wymuszenie) już nie istnieje między tymi dwiema właściwościami. Chociaż rzadko zdarza się, aby na obiekcie istniały dwie takie właściwości, których wartości są dosłownie identyczne (i mają ten sam typ), można również zastosować parametr Converter
do powiązania z {RelativeSource Self}
i użyć konwertera do konwersji między typami źródłowymi a docelowymi. Inny scenariusz dla {RelativeSource Self}
to możliwość bycia częścią MultiDataTrigger.
Na przykład następujący kod XAML definiuje element Rectangle, tak aby niezależnie od tego, jaka wartość została wprowadzona dla Width, Rectangle jest zawsze kwadratem: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>
{RelativeSource PreviousData}
przydaje się w szablonach danych lub w przypadkach, gdy powiązania używają kolekcji jako źródła danych. Za pomocą {RelativeSource PreviousData}
można wyróżniać relacje między sąsiednimi elementami danych w kolekcji. Powiązana technika polega na ustanowieniu MultiBinding między bieżącymi i poprzednimi elementami w źródle danych, a użycie konwertera w tym powiązaniu w celu określenia różnicy między dwoma elementami i ich właściwościami.
W poniższym przykładzie pierwsza TextBlock w szablonie elementów wyświetla bieżącą liczbę. Drugie powiązanie TextBlock to MultiBinding, który nominalnie ma dwa składniki Binding: bieżący rekord i powiązanie, które celowo używa poprzedniego rekordu danych przy użyciu {RelativeSource PreviousData}
. Następnie przetwornik na MultiBinding oblicza różnicę i zwraca ją do powiązania.
<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>
Opis powiązania danych jako pojęcia nie został opisany w tym miejscu, zobacz Omówienie powiązania danych.
W implementacji procesora WPF XAML obsługa tego rozszerzenia znaczników jest definiowana przez klasę RelativeSource.
RelativeSource
jest rozszerzeniem znaczników. Rozszerzenia znaczników są zazwyczaj implementowane, gdy istnieje potrzeba zmiany wartości atrybutów na inne niż wartości dosłowne lub nazwy obsługi, oraz gdy ta potrzeba jest bardziej ogólna niż tylko umieszczanie konwerterów typów na określonych typach lub właściwościach. Wszystkie rozszerzenia znaczników w języku XAML używają {
i }
znaków w ich składni atrybutu, która jest konwencją, zgodnie z którą procesor XAML rozpoznaje, że rozszerzenie znaczników musi przetworzyć atrybut. Aby uzyskać więcej informacji, zobacz Rozszerzenia znaczników i WPF XAML.
Zobacz też
.NET Desktop feedback