RelativeSource MarkupExtension

Określa właściwości RelativeSource źródła powiązania, które ma być używane w rozszerzeniu znaczników powiązania lub podczas ustawiania RelativeSource właściwości elementu ustanowionego Binding 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 Jedna z następujących:

- Token Selfciągu ; odpowiada RelativeSource elementowi utworzonemu za pomocą właściwości Mode ustawionej na Selfwartość .
- Token TemplatedParentciągu ; odpowiada RelativeSource elementowi utworzonemu za pomocą właściwości Mode ustawionej na TemplatedParentwartość .
- Token PreviousDataciągu ; odpowiada RelativeSource elementowi utworzonemu za pomocą właściwości Mode ustawionej na PreviousDatawartość .
- Zobacz poniżej, aby uzyskać informacje na FindAncestor temat trybu.
FindAncestor Token FindAncestorciągu . Użycie tego tokenu powoduje wprowadzenie trybu, w którym RelativeSource określa typ przodka i opcjonalnie poziom przodka. Odpowiada to obiektowi utworzonemu RelativeSource za pomocą właściwości Mode ustawionej na FindAncestorwartość .
typeName Wymagany dla FindAncestor trybu. Nazwa typu, który wypełnia AncestorType właściwość .
intLevel Opcjonalnie dla FindAncestor trybu. Poziom elementu nadrzędnego (patrząc w kierunku nadrzędności w drzewie logicznym).

Uwagi

{RelativeSource TemplatedParent} Użycie powiązań to kluczowa technika, która odpowiada większej koncepcji 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 lub {RelativeSource TemplatedParent} użycie 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 zawsze powinna znajdować się w drzewie wizualnym określonego typu przodka. Na przykład elementy kontrolki elementy mogą używać FindAncestor użycia do powiązania z właściwościami elementów kontrolującym nadrzędny element. Lub elementy, które są częścią kompozycji kontrolek w szablonie, mogą używać FindAncestor powiązań do elementów nadrzędnych w tej samej strukturze kompozycji.

W składni elementu obiektu dla FindAncestor trybu pokazanego w sekcjach Składnia XAML druga składnia elementu obiektu jest używana specjalnie dla FindAncestor trybu. FindAncestor tryb wymaga AncestorType wartości. Musisz ustawić AncestorType jako atrybut przy użyciu odwołania x:Type Markup Extension do typu obiektu ancestor do wyszukania. Wartość AncestorType jest używana, gdy żądanie powiązania jest przetwarzane w czasie wykonywania.

W przypadku FindAncestor trybu właściwość AncestorLevel opcjonalna może pomóc w uściślaniu wyszukiwania przodków w przypadkach, gdy istnieje prawdopodobnie więcej niż jeden element nadrzędny tego typu w drzewie elementów.

Aby uzyskać więcej informacji na temat korzystania z FindAncestor trybu, 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 przymus) już istnieje między tymi dwiema właściwościami. Chociaż rzadko istnieją dwie właściwości obiektu, tak aby wartości są dosłownie identyczne (i są identyczne), można również zastosować Converter parametr do powiązania, które ma {RelativeSource Self}, i użyć konwertera do konwersji między typami źródłowymi i docelowymi. Innym scenariuszem MultiDataTriggerdla {RelativeSource Self} programu jest element .

Na przykład następujący kod XAML definiuje Rectangle element tak, aby niezależnie od tego, jaka wartość została wprowadzona dla Widthelementu , Rectangle jest zawsze kwadratem: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} jest przydatna w szablonach danych lub w przypadkach, gdy powiązania używają kolekcji jako źródła danych. {RelativeSource PreviousData} Służy do wyróżniania relacji 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 dla tego powiązania w celu określenia różnicy między dwoma elementami i ich właściwościami.

W poniższym przykładzie pierwszy TextBlock w szablonie elementów wyświetla bieżącą liczbę. Drugie TextBlock powiązanie to, MultiBinding które nominalnie ma dwa Binding składniki: bieżący rekord i powiązanie, które celowo używa poprzedniego rekordu danych za pomocą polecenia {RelativeSource PreviousData}. Następnie konwerter na obiekcie MultiBinding oblicza różnicę i zwraca go 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ł omówiony 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 to rozszerzenie 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 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ż