Xamarin.Forms Relativní vazby

Download Sample Stažení ukázky

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á úroveň nadřazeného objektu, která se má vyhledat, když Mode je FindAncestorvlastnost . nn-1 Vynechá AncestorLevel instance AncestorType.
  • AncestorType, typu Type, typ nadřazeného, který má 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, u kterého je použita šablona, ve které existuje vázaný prvek. Další informace najdete 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ý vlastností AncestorType . Další informace najdete v tématu Vytvoření vazby k nadřazené sadě.
  • FindAncestorBindingContextBindingContext označuje nadřazený prvek ve vizuálním stromu vázaného prvku. Tento režim by měl být použit k vytvoření vazby k BindingContext nadřazené vlastnosti reprezentované vlastností AncestorType . 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 část výrazu eliminovat Mode= .

Další informace o rozšířeních značek naleznete v Xamarin.Forms tématu Rozšíření značek XAML.

Vytvoření vazby k sobě

Režim Self relativní vazby se používá k vytvoření vazby vlastnosti elementu na jinou vlastnost stejného elementu:

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

Screenshot of a Self mode relative binding, on iOS and Android

Důležité

Při vazbě vlastnosti elementu na jinou vlastnost na stejném prvku musí být vlastnosti stejného typu. Případně můžete zadat převaděč vazby pro převod hodnoty.

Běžné použití tohoto režimu vazby je nastaven objekt BindingContext na vlastnost sama o 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 pro stránku a poskytuje instanci modelu viewmodel. Vazba ListView na Employees vlastnost modelu viewmodel.

Vytvoření vazby k nadřazené vazbu

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 se používá 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.

Upozornění

Vlastnost AncestorType musí být nastavena na Type při použití FindAncestor režimů a FindAncestorBindingContext relativní vazby, jinak XamlParseException je vyvolán.

Mode Pokud vlastnost není explicitně nastavena, nastavení AncestorType vlastnosti na typ odvozený z Element bude implicitně nastavit Mode vlastnost na FindAncestor. Podobně nastavení AncestorType vlastnosti na typ, který není odvozen z Element , implicitně nastaví Mode vlastnost na FindAncestorBindingContext.

Poznámka

Relativní vazby, které používají FindAncestorBindingContext režim, se po změně všech předků znovu použijí BindingContext .

Následující xaml ukazuje příklad, kde Mode vlastnost bude 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 pro stránku a poskytuje instanci modelu viewmodel. Vazba ListView na Employees vlastnost modelu viewmodel. , DataTemplatekterý definuje vzhled každé položky v ListView, obsahuje Button. Vlastnost tlačítka Command je svázaná s objektem DeleteEmployeeCommand viewmodelu nadřazeného objektu. Klepnutím na odstraníte Button zaměstnance:

Screenshot of a FindAncestor mode relative binding, on iOS and Android

Volitelná AncestorLevel vlastnost navíc může pomoct nejednoznačným vyhledáváním předků ve scénářích, kdy ve vizuálním stromu existuje 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 Label.Text vlastnost vytvoří vazbu na Text vlastnost druhé Entry , která se vyskytuje v vzestupné cestě počínaje cílovým prvkem vazby.

Poznámka

Vlastnost AncestorLevel by měla být nastavena na hodnotu 1 pro vyhledání nadřazeného objektu nejblíže k cílovému prvku vazby.

Vytvoření vazby k nadřazené šabloně

Relativní TemplatedParent režim vazby se používá k vytvoření vazby z řídicí šablony na instanci objektu runtime, na kterou se šablona použije (označuje se jako nadřazená šablona). Tento režim lze použít 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 relativního TemplatedParent režimu 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 Framemá kořenová součást ControlTemplateBindingContext objektu nastavena na instanci runtime objektu, na kterou je šablona použita. Podřízené Frame objekty proto přeloží své vazbové výrazy proti vlastnostem každého CardView objektu:

Screenshot of a TemplatedParent mode relative binding, on iOS and Android

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