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 tipoRelativeBindingSourceMode
, descreve o local da fonte de vinculação em relação à posição do destino de vinculação.AncestorLevel
, do tipoint
, um nível ancestral opcional para procurar, quando aMode
propriedade éFindAncestor
. UmAncestorLevel
dosn
ignoran-1
instâncias doAncestorType
.AncestorType
, do tipoType
, o tipo de ancestral a procurar, quando aMode
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 pelaAncestorType
propriedade. Para obter mais informações, consulte Vincular a um ancestral.FindAncestorBindingContext
indica oBindingContext
do ancestral na árvore visual do elemento ligado. Esse modo deve ser usado para vincular aoBindingContext
de um ancestral representado pelaAncestorType
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:
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 Button
arquivo . 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:
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 TemplateBinding
arquivo .
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 ControlTemplate
execuçã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:
Para obter mais informações sobre modelos de controle, consulte Xamarin.Forms Modelos de controle.