Dela via


RelativeSource MarkupExtension

Anger egenskaper för en RelativeSource bindningskälla som ska användas i ett bindningstilläggeller när du anger egenskapen RelativeSource för ett Binding element som har upprättats i XAML.

XAML-attributanvändning

<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />

XAML-attributanvändning (kapslad i Binding-tillägg)

<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" ... />

Användning av XAML-objektelement

<Binding>
  <Binding.RelativeSource>
    <RelativeSource Mode="modeEnumValue"/>
  </Binding.RelativeSource>
</Binding>

-eller-

<Binding>
  <Binding.RelativeSource>
    <RelativeSource
      Mode="FindAncestor"
      AncestorType="{x:Type typeName}"
      AncestorLevel="intLevel"
    />
  </Binding.RelativeSource>
</Binding>

XAML-värden

Värde Beskrivning
modeEnumValue Något av följande:

– Strängtoken Self; motsvarar en RelativeSource som skapats med egenskapen Mode inställd på Self.
– Strängtoken TemplatedParent; motsvarar en RelativeSource som skapats med egenskapen Mode inställd på TemplatedParent.
– Strängtoken PreviousData; motsvarar en RelativeSource som skapats med egenskapen Mode inställd på PreviousData.
- Se nedan för information om FindAncestor läge.
FindAncestor Strängtoken FindAncestor. Med denna token aktiveras ett läge där en RelativeSource anger en överordnad typ och eventuellt en överordnad nivå. Detta motsvarar en RelativeSource som skapats med egenskapen Mode inställd på FindAncestor.
typeName Krävs för FindAncestor läge. Namnet på en typ som fyller egenskapen AncestorType.
intLevel Valfritt för FindAncestor läge. En förfadernivå (utvärderas i föräldrarnas riktning i det logiska trädet).

Anmärkningar

{RelativeSource TemplatedParent} bindningsanvändning är en viktig teknik som hanterar ett större begrepp om separation av en kontrolls användargränssnitt och en kontrolls logik. Detta möjliggör bindning inifrån malldefinitionen till det överordnade objektet (körningsobjektets instans där mallen tillämpas). I det här fallet är TemplateBinding Markup Extension i själva verket en förkortning för följande bindningsuttryck: {Binding RelativeSource={RelativeSource TemplatedParent}}. TemplateBinding eller {RelativeSource TemplatedParent} användningar är båda endast relevanta inom den XAML som definierar en mall. Mer information finns i TemplateBinding Markup Extension.

{RelativeSource FindAncestor} används främst i kontrollmallar eller förutsägbara fristående gränssnittssammansättningar, för fall där en kontroll alltid förväntas finnas i ett visuellt träd av en viss överordnad typ. Objekt i en objektkontroll kan till exempel använda FindAncestor för att binda till egenskaper hos deras överordnade objektkontroll. Eller så kan element som ingår i kontrollsammansättningen i en mall använda FindAncestor bindningar till de överordnade elementen i samma sammansättningsstruktur.

I objektelementsyntaxen för FindAncestor läge som visas i avsnitten XAML-syntax används den andra objektelementsyntaxen specifikt för FindAncestor läge. FindAncestor läge kräver ett AncestorType värde. Du måste ange AncestorType som ett attribut med hjälp av ett x:Type Markup-tillägg referens till typen av överordnad som ska sökas efter. Värdet AncestorType används när begäran om bindning bearbetas under körning.

För läget FindAncestor kan den valfria egenskapen AncestorLevel hjälpa till att lösa upp tvetydigheter i förfäderuppslaget i de fall där det möjligen finns fler än en förfader av den typen i elementträdet.

Mer information om hur du använder FindAncestor läge finns i RelativeSource.

{RelativeSource Self} är användbart för scenarier där en egenskap för en instans ska vara beroende av värdet för en annan egenskap för samma instans, och det inte redan finns någon allmän beroendeegenskapsrelation (till exempel tvång) mellan dessa två egenskaper. Även om det är ovanligt att det finns två egenskaper på ett objekt så att värdena bokstavligen är identiska (och är identiskt skrivna), kan du också använda en Converter-parameter för en bindning som har {RelativeSource Self}och använda konverteraren för att konvertera mellan käll- och måltyper. Ett annat scenario för {RelativeSource Self} är som en del av en MultiDataTrigger.

Följande XAML definierar till exempel ett Rectangle element så att oavsett vilket värde som anges för Widthär Rectangle alltid en kvadrat: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} är användbart antingen i datamallar eller i fall där bindningar använder en samling som datakälla. Du kan använda {RelativeSource PreviousData} för att markera relationer mellan intilliggande dataobjekt i samlingen. En relaterad teknik är att upprätta en MultiBinding mellan de aktuella och tidigare objekten i datakällan och använda en konverterare på bindningen för att fastställa skillnaden mellan de två objekten och deras egenskaper.

I följande exempel visar den första TextBlock i objektmallen det aktuella talet. Den andra TextBlock bindningen är en MultiBinding som nominellt har två Binding komponenter: den aktuella posten och en bindning som avsiktligt använder den tidigare dataposten med hjälp av {RelativeSource PreviousData}. Sedan beräknar en konverterare på MultiBinding skillnaden och returnerar den till bindningen.

<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>

Här beskrivs inte hur du beskriver databindning som ett begrepp, se Översikt över databindning.

I WPF XAML-processorimplementeringen definieras hanteringen för det här påläggstillägget av klassen RelativeSource.

RelativeSource är ett markup-tillägg. Markeringstillägg implementeras vanligtvis när det finns ett krav på att escape-attributvärden ska vara andra än literalvärden eller hanterarnamn, och kravet är mer globalt än att bara placera typkonverterare på vissa typer eller egenskaper. Alla markup-extensions i XAML använder tecknen { och } i sin attributsyntax, vilket är den konvention som gör att en XAML-processor känner igen att en markup-extension måste bearbeta attributet. Mer information finns i Markup Extensions and WPF XAML.

Se även