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, typu RelativeBindingSourceMode, popisuje umístění zdroje vazby vzhledem k pozici cíle vazby.
  • AncestorLevel, typu int, volitelná nadřazená úroveň, která se má vyhledat, pokud Mode je FindAncestorvlastnost . A AncestorLevel of n skips n-1 instance of the AncestorType.
  • AncestorType, typu Type, typ předku hledat, když Mode je FindAncestorvlastnost .

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čuje BindingContext 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 BindingContext 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:

Snímek obrazovky s relativní vazbou v režimu vlastního režimu v iOSu a Androidu

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. , DataTemplatekterý definuje vzhled každé položky v , ListViewobsahuje .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:

Snímek obrazovky s relativní vazbou režimu FindAncestor v iOSu a Androidu

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:

Snímek obrazovky s relativní vazbou režimu TemplatedParent v iOSu a Androidu

Další informace o šablonách ovládacích prvků naleznete v tématu Xamarin.Forms Šablony ovládacích prvků.