Share via


Xamarin.Forms Ligações relativas

As ligações relativas fornecem a capacidade de definir a origem da vinculação em relação à posição do destino da vinculação. Eles são criados com a RelativeSource extensão de marcação e definidos como a Source propriedade de uma expressão de vinculação.

A RelativeSource extensão de marcação é suportada RelativeSourceExtension pela classe, que define as seguintes propriedades:

  • Mode, do tipo RelativeBindingSourceMode, descreve o local da fonte de vinculação em relação à posição do destino de vinculação.
  • AncestorLevel, do tipo int, um nível ancestral opcional para procurar, quando a Mode propriedade é FindAncestor. Um AncestorLevel dos n ignora n-1 instâncias do AncestorType.
  • AncestorType, do tipo Type, o tipo de ancestral a procurar, quando a Mode propriedade é FindAncestor.

Observação

O analisador XAML permite que a RelativeSourceExtension classe seja abreviada como RelativeSource.

A Mode propriedade deve ser definida como um dos RelativeBindingSourceMode membros da enumeração:

  • TemplatedParent Indica o elemento ao qual o modelo, no qual o elemento acoplado existe, é aplicado. Para obter mais informações, consulte Vincular a um pai modelo.
  • Self indica o elemento no qual a associação está sendo definida, permitindo que você vincule uma propriedade desse elemento a outra propriedade no mesmo elemento. Para obter mais informações, consulte Vincular a si mesmo.
  • FindAncestor indica o ancestral na árvore visual do elemento ligado. Esse modo deve ser usado para vincular a um controle ancestral representado pela AncestorType propriedade. Para obter mais informações, consulte Vincular a um ancestral.
  • FindAncestorBindingContext indica o BindingContext do ancestral na árvore visual do elemento ligado. Esse modo deve ser usado para vincular ao BindingContext de um ancestral representado pela AncestorType propriedade. Para obter mais informações, consulte Vincular a um ancestral.

A Mode propriedade é a propriedade content da RelativeSourceExtension classe. Portanto, para expressões de marcação XAML expressas com chaves curvas, você pode eliminar a Mode= parte da expressão.

Para obter mais informações sobre Xamarin.Forms extensões de marcação, consulte Extensões de marcação XAML.

Vincular-se a si mesmo

O Self modo de vinculação relativa é usado para vincular uma propriedade de um elemento a outra propriedade no mesmo elemento:

<BoxView Color="Red"
         WidthRequest="200"
         HeightRequest="{Binding Source={RelativeSource Self}, Path=WidthRequest}"
         HorizontalOptions="Center" />

Neste exemplo, o BoxView define sua WidthRequest propriedade como um tamanho fixo e a propriedade se vincula HeightRequest à WidthRequest propriedade. Portanto, ambas as propriedades são iguais e, portanto, um quadrado é desenhado:

Captura de tela de uma vinculação relativa do modo Self, no iOS e Android

Importante

Ao vincular uma propriedade de um elemento a outra propriedade no mesmo elemento, as propriedades devem ser do mesmo tipo. Como alternativa, você pode especificar um conversor na associação para converter o valor.

Um uso comum desse modo de vinculação é definir um objeto BindingContext como uma propriedade em si mesmo. O código a seguir mostra um exemplo disso:

<ContentPage ...
             BindingContext="{Binding Source={RelativeSource Self}, Path=DefaultViewModel}">
    <StackLayout>
        <ListView ItemsSource="{Binding Employees}">
            ...
        </ListView>
    </StackLayout>
</ContentPage>

Neste exemplo, o BindingContext da página é definido como a DefaultViewModel propriedade de si mesmo. Essa propriedade é definida no arquivo code-behind da página e fornece uma instância viewmodel. O ListView vincula à Employees propriedade do viewmodel.

Ligar a um ancestral

Os FindAncestor modos de vinculação e FindAncestorBindingContext relativo são usados para vincular a elementos pai, de um determinado tipo, na árvore visual. O FindAncestor modo é usado para vincular a um elemento pai, que deriva do Element tipo. O FindAncestorBindingContext modo é usado para vincular ao BindingContext de um elemento pai.

Aviso

A AncestorType propriedade deve ser definida como a Type ao usar os FindAncestor modos de vinculação e FindAncestorBindingContext relativa, caso contrário, um XamlParseException é lançado.

Se a Mode propriedade não estiver definida explicitamente, definir a AncestorType propriedade como um tipo derivado de Element definirá implicitamente a Mode propriedade como FindAncestor. Da mesma forma, definir a AncestorType propriedade como um tipo que não deriva de Element definirá implicitamente a Mode propriedade como FindAncestorBindingContext.

Observação

As ligações relativas que usam o FindAncestorBindingContext modo serão reaplicadas quando os BindingContext ancestrais mudarem.

O XAML a seguir mostra um exemplo em que a Mode propriedade será definida implicitamente como FindAncestorBindingContext:

<ContentPage ...
             BindingContext="{Binding Source={RelativeSource Self}, Path=DefaultViewModel}">
    <StackLayout>
        <ListView ItemsSource="{Binding Employees}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal">
                            <Label Text="{Binding Fullname}"
                                   VerticalOptions="Center" />
                            <Button Text="Delete"
                                    Command="{Binding Source={RelativeSource AncestorType={x:Type local:PeopleViewModel}}, Path=DeleteEmployeeCommand}"
                                    CommandParameter="{Binding}"
                                    HorizontalOptions="EndAndExpand" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>

Neste exemplo, o BindingContext da página é definido como a DefaultViewModel propriedade de si mesmo. Essa propriedade é definida no arquivo code-behind da página e fornece uma instância viewmodel. O ListView vincula à Employees propriedade do viewmodel. O DataTemplate, que define a aparência de cada item no ListView, contém um Buttonarquivo . A propriedade do Command botão é vinculada ao DeleteEmployeeCommand no modelo de exibição de seu pai. Tocar em um Button exclui um funcionário:

Captura de tela de uma vinculação relativa do modo FindAncestor no iOS e Android

Além disso, a propriedade opcional AncestorLevel pode ajudar a desambiguar a pesquisa de ancestral em cenários em que possivelmente há mais de um ancestral desse tipo na árvore visual:

<Label Text="{Binding Source={RelativeSource AncestorType={x:Type Entry}, AncestorLevel=2}, Path=Text}" />

Neste exemplo, a Label.Text propriedade se vincula à Text propriedade do segundo Entry que é encontrado no caminho ascendente, começando no elemento de destino da associação.

Observação

A AncestorLevel propriedade deve ser definida como 1 para localizar o ancestral mais próximo do elemento de destino de vinculação.

Vincular a um pai modelo

O TemplatedParent modo de vinculação relativa é usado para vincular de dentro de um modelo de controle à instância do objeto de tempo de execução à qual o modelo é aplicado (conhecido como pai do modelo). Esse modo só é aplicável se a vinculação relativa estiver dentro de um modelo de controle e for semelhante à configuração de um TemplateBindingarquivo .

O XAML a seguir mostra um exemplo do TemplatedParent modo de vinculação relativa:

<ContentPage ...>
    <ContentPage.Resources>
        <ControlTemplate x:Key="CardViewControlTemplate">
            <Frame BindingContext="{Binding Source={RelativeSource TemplatedParent}}"
                   BackgroundColor="{Binding CardColor}"
                   BorderColor="{Binding BorderColor}"
                   ...>
                <Grid>
                    ...
                    <Label Text="{Binding CardTitle}"
                           ... />
                    <BoxView BackgroundColor="{Binding BorderColor}"
                             ... />
                    <Label Text="{Binding CardDescription}"
                           ... />
                </Grid>
            </Frame>
        </ControlTemplate>
    </ContentPage.Resources>
    <StackLayout>        
        <controls:CardView BorderColor="DarkGray"
                           CardTitle="John Doe"
                           CardDescription="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla elit dolor, convallis non interdum."
                           IconBackgroundColor="SlateGray"
                           IconImageSource="user.png"
                           ControlTemplate="{StaticResource CardViewControlTemplate}" />
        <controls:CardView BorderColor="DarkGray"
                           CardTitle="Jane Doe"
                           CardDescription="Phasellus eu convallis mi. In tempus augue eu dignissim fermentum. Morbi ut lacus vitae eros lacinia."
                           IconBackgroundColor="SlateGray"
                           IconImageSource="user.png"
                           ControlTemplate="{StaticResource CardViewControlTemplate}" />
        <controls:CardView BorderColor="DarkGray"
                           CardTitle="Xamarin Monkey"
                           CardDescription="Aliquam sagittis, odio lacinia fermentum dictum, mi erat scelerisque erat, quis aliquet arcu."
                           IconBackgroundColor="SlateGray"
                           IconImageSource="user.png"
                           ControlTemplate="{StaticResource CardViewControlTemplate}" />
    </StackLayout>
</ContentPage>

Neste exemplo, o Frame, que é o elemento raiz do , tem seu BindingContext conjunto como a instância do objeto de tempo de ControlTemplateexecução à qual o modelo é aplicado. Portanto, o e seus filhos resolvem Frame suas expressões de vinculação em relação às propriedades de cada CardView objeto:

Captura de tela de uma vinculação relativa do modo TemplatedParent no iOS e Android

Para obter mais informações sobre modelos de controle, consulte Xamarin.Forms Modelos de controle.