Sdílet prostřednictvím


Kompilované vazby

Browse sample. Procházení ukázky

Datové vazby .NET Multi-Platform App UI (.NET MAUI) mají dva hlavní problémy:

  1. Neexistuje žádné ověřování vazbových výrazů v době kompilace. Místo toho jsou vazby vyřešeny za běhu. Proto se žádné neplatné vazby nezjistí, dokud se nechová za běhu, pokud se aplikace nechová podle očekávání nebo se zobrazí chybové zprávy.
  2. Nejsou nákladově efektivní. Vazby se řeší za běhu pomocí kontroly objektů pro obecné účely (reflexe) a režijní náklady se liší od platformy po platformu.

Kompilované vazby zlepšují výkon datových vazeb v aplikacích .NET MAUI překladem výrazů vazeb v době kompilace místo modulu runtime. Kromě toho toto ověřování výrazů vazby v době kompilace umožňuje lepší prostředí pro řešení potíží vývojářů, protože neplatné vazby jsou hlášeny jako chyby sestavení.

Chcete-li použít kompilované vazby, nastavte x:DataType atribut na VisualElement typ objektu, ke kterému VisualElement se objekt a jeho podřízené objekty vytvoří vazby. Doporučuje se nastavit x:DataType atribut na stejné úrovni v hierarchii zobrazení, jako je nastavená BindingContext . Tento atribut je však možné znovu definovat v libovolném umístění v hierarchii zobrazení.

Poznámka:

Kompilované vazby vyžadují použití kompilace XAML, která je ve výchozím nastavení povolená v .NET MAUI. Pokud jste zakázali kompilaci XAML, budete ji muset povolit. Další informace naleznete v tématu Kompilace XAML.

Chcete-li použít kompilované vazby, x:DataType musí být atribut nastaven na řetězcový literál nebo typ používající x:Type rozšíření značek. V době kompilace XAML se všechny neplatné vazbové výrazy oznamují jako chyby sestavení. Kompilátor XAML však bude hlásit pouze chybu sestavení prvního neplatného vazbového výrazu, na který narazí. Všechny platné vazbové výrazy definované v podřízených VisualElement objektech nebo podřízených výrazech budou zkompilovány bez ohledu na to, zda BindingContext je nastavena v xaml nebo kódu. Kompilace vazbového výrazu vygeneruje zkompilovaný kód, který získá hodnotu z vlastnosti ve zdroji, a nastaví ji na vlastnost v cíli zadaném v kódu. Kromě toho může v závislosti na vazbovém výrazu vygenerovaný kód sledovat změny v hodnotě zdrojové vlastnosti a aktualizovat cílovou vlastnost a může odesílat změny z cíle zpět do zdroje.

Důležité

Kompilované vazby jsou zakázány pro všechny vazbové výrazy, které definují Source vlastnost. Důvodem je to, že Source vlastnost je vždy nastavena pomocí x:Reference rozšíření značek, které nelze vyřešit v době kompilace.

Kompilované vazby se navíc v současné době nepodporují u více vazeb.

Použití zkompilovaných vazeb

Následující příklad ukazuje použití zkompilovaných vazeb mezi zobrazeními .NET MAUI a vlastnostmi modelu viewmodel:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DataBindingDemos"
             x:Class="DataBindingDemos.CompiledColorSelectorPage"
             x:DataType="local:HslColorViewModel"
             Title="Compiled Color Selector">
    <ContentPage.BindingContext>
        <local:HslColorViewModel Color="Sienna" />
    </ContentPage.BindingContext>
    ...
    <StackLayout>
        <BoxView Color="{Binding Color}"
                 ... />
        <StackLayout Margin="10, 0">
            <Label Text="{Binding Name}" />
            <Slider Value="{Binding Hue}" />
            <Label Text="{Binding Hue, StringFormat='Hue = {0:F2}'}" />
            <Slider Value="{Binding Saturation}" />
            <Label Text="{Binding Saturation, StringFormat='Saturation = {0:F2}'}" />
            <Slider Value="{Binding Luminosity}" />
            <Label Text="{Binding Luminosity, StringFormat='Luminosity = {0:F2}'}" />
        </StackLayout>
    </StackLayout>    
</ContentPage>

Vytvoří ContentPage instanci a inicializuje HslColorViewModelColor vlastnost v rámci značek elementu vlastnosti pro BindingContext vlastnost. Také ContentPage definuje x:DataType atribut jako typ modelu viewmodel, který označuje, že všechny vazbové výrazy v ContentPage hierarchii zobrazení budou zkompilovány. To lze ověřit změnou některého z vazeb výrazů na vazbu na neexistující vlastnost viewmodel, která způsobí chybu sestavení. I když tento příklad nastaví x:DataType atribut na řetězcový literál, může být také nastaven na typ s rozšířením x:Type značek. Další informace o x:Type rozšíření značek naleznete v tématu x:Type Markup Extension.

Důležité

Atribut x:DataType lze znovu definovat v libovolném bodě v hierarchii zobrazení.

Elementy LabelBoxViewa Slider zobrazení dědí kontext vazby z objektu ContentPage. Tato zobrazení jsou všechny cílové vazby, které odkazují na vlastnosti zdroje v modelu viewmodel. BoxView.Color Pro vlastnost a Label.Text vlastnost jsou datové vazby OneWay – vlastnosti v zobrazení jsou nastaveny z vlastností v modelu view. Vlastnost Slider.Value však používá TwoWay vazbu. To umožňuje nastavit každý Slider z modelu zobrazení, a také pro model zobrazení nastavit z každého Slider.

Při prvním spuštění příkladu jsou elementy BoxViewLabel a Slider elementy nastaveny z modelu viewmodel na základě počáteční Color vlastnosti nastavena při vytvoření instance modelu viewmodel. Při manipulaci BoxView s posuvníky se prvky odpovídajícím Label způsobem aktualizují:

Compiled color selector.

Další informace o tomto selektoru barev najdete v tématu ViewModels a oznámení o změně vlastností.

Použití zkompilovaných vazeb v DataTemplate

Vazby v objektu DataTemplate jsou interpretovány v kontextu šablony objektu. Proto při použití zkompilovaných vazeb v objektu DataTemplate, DataTemplate musí deklarovat typ jeho datového objektu pomocí atributu x:DataType .

Následující příklad ukazuje použití zkompilovaných vazeb v :DataTemplate

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DataBindingDemos"
             x:Class="DataBindingDemos.CompiledColorListPage"
             Title="Compiled Color List">
    <Grid>
        ...
        <ListView x:Name="colorListView"
                  ItemsSource="{x:Static local:NamedColor.All}"
                  ... >
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:NamedColor">
                    <ViewCell>
                        <StackLayout Orientation="Horizontal">
                            <BoxView Color="{Binding Color}"
                                     ... />
                            <Label Text="{Binding FriendlyName}"
                                   ... />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <!-- The BoxView doesn't use compiled bindings -->
        <BoxView Color="{Binding Source={x:Reference colorListView}, Path=SelectedItem.Color}"
                 ... />
    </Grid>
</ContentPage>

Vlastnost ListView.ItemsSource je nastavena na statickou NamedColor.All vlastnost. Třída NamedColor používá reflexi .NET k vytvoření výčtu všech statických veřejných polí třídy Colors a k jejich uložení s jejich názvy v kolekci, která je přístupná ze statické All vlastnosti. Proto se vyplní ListView všemi NamedColor instancemi. Pro každou položku v objektu ListViewje kontext vazby položky nastaven na NamedColor objekt. Label Prvky BoxView a prvky v objektu ViewCell jsou vázány na NamedColor vlastnosti.

Definuje DataTemplatex:DataType atribut, který má být typem NamedColor , což znamená, že všechny vazbové výrazy v DataTemplate hierarchii zobrazení budou zkompilovány. To lze ověřit změnou některého z vazeb výrazů na vazbu na neexistující NamedColor vlastnost, což způsobí chybu sestavení. I když tento příklad nastaví x:DataType atribut na řetězcový literál, může být také nastaven na typ s rozšířením x:Type značek. Další informace o x:Type rozšíření značek naleznete v tématu x:Type Markup Extension.

Při prvním spuštění příkladu se ListView naplní instancemi NamedColor . Pokud je vybrána položkaListView, BoxView.Color vlastnost je nastavena na barvu vybrané položky v :ListView

Compiled color list.

Výběr dalších položek v aktualizaci ListView barvy BoxView.

Kombinování zkompilovaných vazeb s klasickými vazbami

Vazbové výrazy jsou zkompilovány pouze pro hierarchii zobrazení, na které x:DataType je atribut definován. Naopak všechna zobrazení v hierarchii, na které x:DataType není atribut definován, budou používat klasické vazby. Zkombinovat kompilované vazby a klasické vazby na stránce je proto možné kombinovat. Například v předchozí části zobrazení v rámci DataTemplate zkompilovaných vazeb, zatímco BoxView tato možnost je nastavená na barvu vybranou v této části ListView .

Pečlivé strukturování x:DataType atributů proto může vést ke stránce pomocí zkompilovaných a klasických vazeb. Případně můžete atribut znovu definovat v libovolném bodě v hierarchii zobrazení tak, x:DataType aby null používal x:Null rozšíření značek. To znamená, že všechny vazbové výrazy v hierarchii zobrazení budou používat klasické vazby. Následující příklad ukazuje tento přístup:

<StackLayout x:DataType="local:HslColorViewModel">
    <StackLayout.BindingContext>
        <local:HslColorViewModel Color="Sienna" />
    </StackLayout.BindingContext>
    <BoxView Color="{Binding Color}"
             VerticalOptions="FillAndExpand" />
    <StackLayout x:DataType="{x:Null}"
                 Margin="10, 0">
        <Label Text="{Binding Name}" />
        <Slider Value="{Binding Hue}" />
        <Label Text="{Binding Hue, StringFormat='Hue = {0:F2}'}" />
        <Slider Value="{Binding Saturation}" />
        <Label Text="{Binding Saturation, StringFormat='Saturation = {0:F2}'}" />
        <Slider Value="{Binding Luminosity}" />
        <Label Text="{Binding Luminosity, StringFormat='Luminosity = {0:F2}'}" />
    </StackLayout>
</StackLayout>   

Kořen StackLayout nastaví x:DataType atribut tak, aby byl typem HslColorViewModel , což znamená, že všechny vazbové výrazy v hierarchii kořenového StackLayout zobrazení budou zkompilovány. Vnitřní StackLayout předefinuje x:DataType atribut null pomocí výrazu značky x:Null . Proto vazbové výrazy uvnitř vnitřní StackLayout používají klasické vazby. Pouze v BoxViewkořenové StackLayout hierarchii zobrazení používá zkompilované vazby.

Další informace o výrazu x:Null značek naleznete v tématu x:Null Markup Extension.

Výkon

Kompilované vazby zlepšují výkon datových vazeb s různou výhodou výkonu:

  • Zkompilovaná vazba, která používá oznámení o změně vlastnosti (tj. OneWay, OneWayToSourcenebo TwoWay vazbu), se vyřeší přibližně 8krát rychleji než klasická vazba.
  • Zkompilovaná vazba, která nepoužívá oznámení o změně vlastnosti (tj. OneTime vazby), se vyřeší přibližně 20krát rychleji než klasická vazba.
  • BindingContext Nastavení kompilované vazby, která používá oznámení o změně vlastnosti (tj. OneWay, OneWayToSourcenebo TwoWay vazbu), je přibližně 5krát rychlejší než nastavení BindingContext u klasické vazby.
  • BindingContext Nastavení kompilované vazby, která nepoužívá oznámení o změně vlastnosti (tj. OneTime vazby), je přibližně 7krát rychlejší než nastavení BindingContext u klasické vazby.

Tyto rozdíly v výkonu se dají zvětšit na mobilních zařízeních, závisí na používané platformě, na používané verzi operačního systému a na zařízení, na kterém je aplikace spuštěná.