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.

Zobacz też