Xamarin.Forms Relativní vazby
Relativní vazby poskytují možnost nastavit zdroj vazby vzhledem k pozici cíle vazby. Vytvoří se s rozšířením RelativeSource
značek a nastaví se jako Source
vlastnost vazbového výrazu.
Rozšíření RelativeSource
značek je podporováno RelativeSourceExtension
třídou, která definuje následující vlastnosti:
Mode
, typuRelativeBindingSourceMode
, popisuje umístění zdroje vazby vzhledem k pozici cíle vazby.AncestorLevel
, typuint
, volitelná nadřazená úroveň, která se má vyhledat, pokudMode
jeFindAncestor
vlastnost . AAncestorLevel
ofn
skipsn-1
instance of theAncestorType
.AncestorType
, typuType
, typ předku hledat, kdyžMode
jeFindAncestor
vlastnost .
Poznámka:
Analyzátor XAML umožňuje RelativeSourceExtension
, aby třída byla zkrácena jako RelativeSource
.
Vlastnost Mode
by měla být nastavena na jeden z členů výčtu RelativeBindingSourceMode
:
TemplatedParent
označuje prvek, na který je použita šablona, ve které existuje vázaný prvek. Další informace naleznete v tématu Vytvoření vazby k nadřazené šabloně.Self
označuje prvek, na kterém je vazba nastavena, což umožňuje vytvořit vazbu jedné vlastnosti tohoto prvku na jinou vlastnost na stejném prvku. Další informace najdete v tématu Vytvoření vazby k sobě.FindAncestor
označuje nadřazený prvek ve vizuálním stromu vázaného prvku. Tento režim by se měl použít k vytvoření vazby na nadřazený ovládací prvek reprezentovanýAncestorType
vlastností. Další informace najdete v tématu Vytvoření vazby k nadřazené sadě.FindAncestorBindingContext
označujeBindingContext
nadřazený prvek ve vizuálním stromu vázaného prvku. Tento režim by se měl použít k vytvoření vazby naBindingContext
nadřazený objekt reprezentovanýAncestorType
vlastností. Další informace najdete v tématu Vytvoření vazby k nadřazené sadě.
Vlastnost Mode
je vlastnost RelativeSourceExtension
obsahu třídy. Proto u výrazů značek XAML vyjádřených složenými závorkami můžete eliminovat Mode=
část výrazu.
Další informace o rozšířeních značek najdete v Xamarin.Forms tématu Rozšíření značek XAML.
Vytvoření vazby k vlastnímu prostředí
Relativní Self
režim vazby se používá vázání vlastnosti elementu na jinou vlastnost na stejném prvku:
<BoxView Color="Red"
WidthRequest="200"
HeightRequest="{Binding Source={RelativeSource Self}, Path=WidthRequest}"
HorizontalOptions="Center" />
V tomto příkladu BoxView
nastaví jeho WidthRequest
vlastnost na pevnou velikost a HeightRequest
vlastnost vytvoří vazbu na WidthRequest
vlastnost. Obě vlastnosti jsou tedy stejné a proto je nakreslen čtverec:
Důležité
Při vytvoření vazby vlastnosti elementu na jinou vlastnost na stejném prvku musí být vlastnosti stejného typu. Případně můžete pro vazbu zadat převaděč, který hodnotu převede.
Běžným použitím tohoto režimu vazby je nastavení objektu BindingContext
na vlastnost na sobě. Následující kód ukazuje příklad:
<ContentPage ...
BindingContext="{Binding Source={RelativeSource Self}, Path=DefaultViewModel}">
<StackLayout>
<ListView ItemsSource="{Binding Employees}">
...
</ListView>
</StackLayout>
</ContentPage>
V tomto příkladu BindingContext
je stránka nastavena na DefaultViewModel
vlastnost sebe sama. Tato vlastnost je definována v souboru kódu za stránkou a poskytuje instanci modelu viewmodel. Vytvoří ListView
vazbu na Employees
vlastnost modelu viewmodel.
Svázání s nadřazeným objektem
Režimy FindAncestor
a FindAncestorBindingContext
relativní vazby se používají k vytvoření vazby k nadřazeným prvkům určitého typu ve vizuálním stromu. Režim FindAncestor
slouží k vytvoření vazby na nadřazený prvek, který je odvozen od Element
typu. Režim FindAncestorBindingContext
se používá k vytvoření vazby na BindingContext
nadřazený prvek.
Upozorňující
Vlastnost AncestorType
musí být nastavena na Type
při použití FindAncestor
režimu a FindAncestorBindingContext
relativní vazby, jinak XamlParseException
je vyvolán.
Mode
Pokud vlastnost není explicitně nastavena, nastavení AncestorType
vlastnosti na typ, který je odvozen odElement
, implicitně nastaví Mode
vlastnost na FindAncestor
. Podobně nastavení AncestorType
vlastnosti na typ, který není odvozen od Element
, implicitně nastaví Mode
vlastnost na FindAncestorBindingContext
.
Poznámka:
Relativní vazby, které používají FindAncestorBindingContext
režim, se po změně předků znovu použijí BindingContext
.
Následující XAML ukazuje příklad, kde Mode
bude vlastnost implicitně nastavena na 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>
V tomto příkladu BindingContext
je stránka nastavena na DefaultViewModel
vlastnost sebe sama. Tato vlastnost je definována v souboru kódu za stránkou a poskytuje instanci modelu viewmodel. Vytvoří ListView
vazbu na Employees
vlastnost modelu viewmodel. , DataTemplate
který definuje vzhled každé položky v , ListView
obsahuje .Button
Vlastnost tlačítka Command
je svázaná s objektem DeleteEmployeeCommand
viewmodel jeho nadřazeného objektu. Klepnutím na odstraníte Button
zaměstnance:
Volitelná AncestorLevel
vlastnost navíc může pomoct nejednoznačné vyhledávání nadřazeného objektu ve scénářích, ve kterých je ve vizuálním stromu pravděpodobně více než jeden nadřazený objekt tohoto typu:
<Label Text="{Binding Source={RelativeSource AncestorType={x:Type Entry}, AncestorLevel=2}, Path=Text}" />
V tomto příkladu vlastnost Label.Text
vytvoří vazbu na Text
vlastnost druhé Entry
, která je zjištěna na vzestupné cestě počínaje cílovým prvkem vazby.
Poznámka:
Vlastnost AncestorLevel
by měla být nastavena na hodnotu 1, aby se našel nadřazený prvek nejblíže k cílovému prvku vazby.
Vytvoření vazby k nadřazené šabloně
Relativní TemplatedParent
režim vazby slouží k vytvoření vazby z řídicí šablony k instanci objektu runtime, na kterou je šablona použita (označovaná jako nadřazená šablona). Tento režim je použitelný pouze v případě, že relativní vazba je v rámci šablony ovládacího prvku a je podobná nastavení TemplateBinding
.
Následující XAML ukazuje příklad TemplatedParent
režimu relativní vazby:
<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>
V tomto příkladu Frame
, což je kořenový prvek ControlTemplate
, má nastavena BindingContext
na instanci runtime objektu, na kterou je šablona použita. Frame
Proto a jeho podřízené objekty přeloží své vazbové výrazy proti vlastnostem každého CardView
objektu:
Další informace o šablonách ovládacích prvků naleznete v tématu Xamarin.Forms Šablony ovládacích prvků.