Xamarin.Forms Relativní vazby

Stáhnout ukázku Stažení ukázky

Relativní vazby poskytují možnost nastavit zdroj vazby vzhledem k pozici cíle vazby. Vytvoří se s RelativeSource rozšířením značek a nastaví se Source jako vlastnost vazbových výrazů.

Rozšíření RelativeSource značek je podporováno RelativeSourceExtension třídou , která definuje následující vlastnosti:

  • Modetyp popisuje umístění zdroje vazby vzhledem k RelativeBindingSourceMode pozici cíle vazby.
  • AncestorLevel, typu int , volitelné úrovně předchůdce, které se mají hledat, když je vlastnost ModeFindAncestor . Při AncestorLevel typu n se n-1 přeskočí instance AncestorType .
  • AncestorType, typu Type , typu nadřazeného objektu, který se má hledat, když Mode je vlastnost FindAncestor .

Poznámka

Analyzátor XAML umožňuje RelativeSourceExtension zkrácení třídy jako RelativeSource .

Vlastnost Mode by měla být nastavena na jeden ze členů RelativeBindingSourceMode výčtu:

  • TemplatedParent označuje prvek, na který je použitá š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 svázat jednu vlastnost tohoto prvku s jinou vlastností stejného prvku. Další informace najdete v tématu Vytvoření vazby k vlastnímu serveru.
  • FindAncestor označuje předchůdce ve vizuálním stromu vázaného prvku. Tento režim by měl být použit k vytvoření vazby k nadřazenému ovládacímu prvku reprezentované AncestorType vlastností. Další informace najdete v tématu Vytvoření vazby k předchůdci.
  • FindAncestorBindingContext označuje nadřazený BindingContext prvek ve vizuálním stromu vázaného prvku. Tento režim by měl být použit k vytvoření vazby na BindingContext nadřazený prvek reprezentovaný AncestorType vlastností . Další informace najdete v tématu Vytvoření vazby k předchůdci.

Vlastnost Mode je vlastnost content RelativeSourceExtension třídy . Proto u výrazů značek XAML vyjádřených složenou závorkou můžete část výrazu Mode= eliminovat.

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

Vytvořit vazbu na sebe sama

Režim Self relativní vazby se používá ke svázání vlastnosti elementu s jinou vlastností stejného prvku:

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

V tomto příkladu nastaví vlastnost na pevnou velikost a vlastnost se BoxViewWidthRequestHeightRequest sváže s WidthRequest vlastností . Proto jsou obě vlastnosti stejné a proto je nakreslen čtverec:

Snímek obrazovky s relativní vazbou v vlastním režimu v režimu vlastní vazby pro iOS a Android

Důležité

Při vytváření vazby vlastnosti prvku na jinou vlastnost stejného prvku musí být vlastnosti stejného typu. Alternativně můžete pro vazbu zadat převaděč pro převod hodnoty.

Běžným použitím tohoto režimu vazby je nastavení objektu BindingContext na vlastnost na sebe sama. Následující kód ukazuje příklad tohoto:

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

V tomto BindingContext příkladu je vlastnost stránky nastavená DefaultViewModel na vlastnost sama o sobě. Tato vlastnost je definována v souboru kódu stránky a poskytuje instanci modelu viewmodel. Objekt ListView se Employees váže na vlastnost modelu viewmodel.

Vytvoření vazby k předchůdci

Režimy relativní vazby a slouží k vytvoření vazby k nadřazeným prvkům určitého typu FindAncestorFindAncestorBindingContext ve vizuálním stromu. Režim FindAncestor slouží k vytvoření vazby k nadřazenému elementu, který je odvozen z Element typu. Režim FindAncestorBindingContext slouží k vytvoření vazby k BindingContext nadřazenému elementu.

Upozornění

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

Pokud vlastnost není explicitně nastavená, nastavení vlastnosti na typ odvozený z implicitně nastaví ModeAncestorType vlastnost na ElementModeFindAncestor . Podobně nastavení vlastnosti na typ, který není odvozen od , implicitně nastaví AncestorTypeElement vlastnost na ModeFindAncestorBindingContext .

Poznámka

Relativní vazby, které používají režim, se znovu použije, FindAncestorBindingContext když se změní nadřazený BindingContext prvek.

Následující kód XAML ukazuje příklad, kdy Mode se vlastnost implicitně nastaví 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 BindingContext příkladu je vlastnost stránky nastavená DefaultViewModel na vlastnost sama o sobě. Tato vlastnost je definována v souboru kódu stránky a poskytuje instanci modelu viewmodel. Objekt ListView se Employees váže na vlastnost modelu viewmodel. DataTemplateObjekt , který definuje vzhled každé položky v , obsahuje objekt ListViewButton . Vlastnost tlačítka je Command svázaná s DeleteEmployeeCommand objektem ve svém nadřazeném modelu viewmodel. Klepnutí na Button odstraní zaměstnance:

Snímek obrazovky s relativní vazbou režimuFindAncestor v režimurelativní vazby pro iOS a Android

Volitelná vlastnost navíc může pomoct jednoznačně rozznačit vyhledávání předchůdců ve scénářích, kdy je ve vizuálním stromu pravděpodobně více než jeden nadřazený prvek tohoto AncestorLevel typu:

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

V tomto příkladu se vlastnost váže na vlastnost sekundy, která se nachází na vzestupné cestě, počínaje Label.TextTextEntry cílovým prvkem vazby.

Poznámka

Vlastnost AncestorLevel by měla být nastavená na 1, aby se našel nadřazený prvek, který je nejblíže cílovému elementu vazby.

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

Režim relativní vazby se používá k vytvoření vazby z šablony ovládacího prvku na instanci objektu modulu runtime, na kterou je šablona použitá (označuje se jako nadřazený objekt TemplatedParent podle šablony). Tento režim je použitelný jenom v případě, že se relativní vazba nachází v šabloně ovládacího prvku a podobá se nastavení TemplateBinding .

Následující kód XAML ukazuje příklad režimu TemplatedParent 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 má objekt , který je kořenovým prvkem objektu , nastavenou na FrameControlTemplate instanci objektu modulu BindingContext runtime, na kterou je šablona použitá. Proto objekt a Frame jeho děti překládá své vazbové výrazy na vlastnosti každého CardView objektu:

Snímek obrazovky s relativní vazbou režimuTemplatedParent v režimu relativnívazby pro iOS a Android

Další informace o šablonách ovládacích prvek najdete v tématu Xamarin.Forms Control Templates .