RelativeSource MarkupExtension
Określa właściwości źródła powiązaniaRelativeSource, które mają być używane w rozszerzeniu znaczników powiązania lubRelativeSourceBinding podczas ustawiania właściwości elementu ustalonego w języku XAML.
Użycie atrybutu języka XAML
<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />
Użycie atrybutu języka XAML (zagnieżdżonego w rozszerzeniu Binding)
<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" ... />
Użycie elementu obiektu języka 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 |
Jeden z poniższych programów: - Token ciągu ; Selfodpowiada właściwości RelativeSource utworzonej z właściwością Mode ustawioną na Self.- Token ciągu ; TemplatedParentodpowiada właściwości RelativeSource utworzonej z właściwością Mode ustawioną na TemplatedParent.- Token ciągu ; PreviousDataodpowiada właściwości RelativeSource utworzonej z właściwością Mode ustawioną na PreviousData.— Zobacz poniżej, aby uzyskać informacje o trybie FindAncestor . |
FindAncestor |
Token ciągu FindAncestor. Użycie tego tokenu przechodzi w tryb, w którym element RelativeSource określa typ nadrzędny i opcjonalnie poziom nadrzędny. Odpowiada to właściwości utworzonej RelativeSource jako z właściwością Mode ustawioną na FindAncestor. |
typeName |
Wymagane dla FindAncestor trybu. Nazwa typu, który wypełnia właściwość AncestorType . |
intLevel |
Opcjonalne dla FindAncestor trybu. Poziom elementu nadrzędnego (patrząc w kierunku nadrzędności w drzewie logicznym). |
Uwagi
{RelativeSource TemplatedParent} Powiązania użycia są kluczową techniką, która dotyczy większego pojęcia rozdzielenia interfejsu użytkownika kontrolki i logiki kontrolki. Umożliwia tworzenie powiązań z wewnątrz definicji szablonu do elementu nadrzędnego używającego szablonu (tzn. do wystąpienia obiektu, do którego w czasie wykonywania szablon jest stosowany). W tym przypadku rozszerzenie znaczników TemplateBinding jest w rzeczywistości skrótem dla następującego wyrażenia powiązania: {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBinding Zarówno {RelativeSource TemplatedParent} użycie, jak i są istotne tylko w języku XAML, który definiuje szablon. Aby uzyskać więcej informacji, zobacz TemplateBinding Markup Extension (Rozszerzenie znaczników TemplateBinding).
{RelativeSource FindAncestor} Jest używany głównie w szablonach kontrolek lub przewidywalnych, samodzielnych kompozycjach interfejsu użytkownika, w przypadkach, gdy kontrolka powinna zawsze być w drzewie wizualnym określonego typu nadrzędnego. Na przykład elementy kontrolki elementów mogą używać FindAncestor użycia do powiązania z właściwościami elementów nadrzędnych nadrzędnych. Lub elementy, które są częścią kompozycji kontrolek w szablonie, FindAncestor mogą używać powiązań z elementami nadrzędnymi w tej samej strukturze kompozycji.
W składni elementu obiektu dla trybu FindAncestor pokazanego w sekcjach Składnia XAML składnia drugiego elementu obiektu jest używana specjalnie dla FindAncestor trybu. FindAncestor Tryb wymaga AncestorType wartości. Należy ustawić jako atrybut AncestorType przy użyciu odwołania rozszerzenia znaczników x:Type do typu elementu nadrzędnego do wyszukiwania. Wartość AncestorType jest używana podczas przetwarzania żądania powiązania w czasie rzeczywistym.
W FindAncestor przypadku trybu opcjonalna właściwość AncestorLevel może ułatwić ujednoznacznienie wyszukiwania nadrzędnego w przypadkach, gdy istnieje prawdopodobnie więcej niż jeden element nadrzędny tego typu w drzewie elementów nadrzędnych.
Aby uzyskać więcej informacji na temat korzystania z trybu FindAncestor , zobacz RelativeSource.
{RelativeSource Self} Jest przydatne 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 i nie istnieje żadna ogólna relacja właściwości zależności (taka jak koercja) między tymi dwiema właściwościami. Chociaż rzadko istnieją dwie właściwości obiektu w taki sposób, że wartości są dosłownie identyczne (i są identycznie typowane), można również zastosować parametr do powiązania, które ma , i Converter{RelativeSource Self}użyć konwertera do konwersji między typami źródłowymi i docelowymi. Inny scenariusz dla jest {RelativeSource Self} częścią .MultiDataTrigger
Na przykład następujący kod XAML definiuje Rectangle element w taki sposób, że niezależnie od tego, jaka Widthwartość jest wprowadzana dla elementu , Rectangle element jest zawsze kwadratem: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>
{RelativeSource PreviousData} jest przydatne w szablonach danych lub w przypadkach, gdy powiązania są źródłem danych korzystającymi z kolekcji. Umożliwia wyróżnianie relacji {RelativeSource PreviousData} między sąsiednimi elementami danych w kolekcji. Powiązaną techniką jest ustanowienie obiektu między MultiBinding bieżącym i poprzednim elementem w źródle danych oraz użycie konwertera dla tego powiązania w celu określenia różnicy między tymi dwoma elementami i ich właściwościami.
W poniższym przykładzie pierwszy w TextBlock szablonie elementów wyświetla bieżącą liczbę. Drugie powiązanie TextBlock to powiązanieMultiBinding, które ma nominalnie Binding dwa składniki: bieżący rekord i powiązanie, które celowo używa poprzedniego rekordu danych przy użyciu .{RelativeSource PreviousData} Następnie konwerter dla metody 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>
Opisywanie powiązania danych jako koncepcji nie jest tutaj uwzględnione, zobacz Omówienie powiązań danych.
W implementacji procesora XAML WPF obsługa tego rozszerzenia znaczników jest definiowana przez klasę RelativeSource .
RelativeSource jest rozszerzeniem znaczników. Rozszerzenia znaczników są zazwyczaj implementowane w sytuacji, gdy istnieje wymóg, aby wartości atrybutów były wyprowadzane w postaci innej niż wartości literałów lub nazwy programów obsługi, a wymóg ma charakter bardziej globalny niż zwykłe umieszczenie konwerterów typów w niektórych typach lub właściwościach. Wszystkie rozszerzenia znaczników w języku XAML { używają znaków i } w składni atrybutów, czyli konwencji, 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.