Sdílet prostřednictvím


Režim vazby

Browse sample. Procházení ukázky

Každá vlastnost vázání .NET Multi-Platform App UI (.NET MAUI) má výchozí režim vazby, který je nastaven při vytvoření vlastnosti bindable a který je k dispozici z DefaultBindingMode vlastnosti objektu BindableProperty . Tento výchozí režim vazby označuje režim, který má účinek, pokud je tato vlastnost cílem datové vazby. Výchozí režim vazby pro většinu vlastností, jako Rotationje , Scalea Opacity je OneWay. Pokud jsou tyto vlastnosti cíle vazby dat, pak je cílová vlastnost nastavena ze zdroje.

Následující příklad ukazuje datovou vazbu definovanou Sliderna :

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="DataBindingDemos.ReverseBindingPage"
             Title="Reverse Binding">
    <StackLayout Padding="10, 0">
        <Label x:Name="label"
               Text="TEXT"
               FontSize="80"
               HorizontalOptions="Center"
               VerticalOptions="Center" />
        <Slider x:Name="slider"
                VerticalOptions="Center"
                Value="{Binding Source={x:Reference label},
                                Path=Opacity}" />
    </StackLayout>
</ContentPage>

V tomto příkladu Label je zdrojem datové vazby a Slider cílem je. Vazba odkazuje na Opacity vlastnost Label, která má výchozí hodnotu 1. Slider Proto je inicializován na hodnotu 1 z počáteční Opacity hodnoty Label. Toto je vidět na následujícím snímku obrazovky:

Reverse binding.

Kromě toho bude Slider i nadále fungovat. Důvodem je, že výchozí režim vazby pro Value vlastnost Slider je TwoWay. To znamená, že pokud Value je vlastnost cíl vazby dat, pak je cíl nastaven ze zdroje, ale zdroj je také nastaven z cíle. To umožňuje Slider nastavit počáteční Opacity hodnotu.

Poznámka:

Vlastnosti s možností vazby nepřiznajují změnu vlastnosti, pokud se tato vlastnost ve skutečnosti nezmění. Tím zabráníte nekonečné smyčce.

Pokud výchozí režim vazby pro cílovou vlastnost není vhodný pro konkrétní datovou vazbu, je možné jej přepsat nastavením Mode vlastnosti (nebo Mode vlastnosti Binding Binding rozšíření značek) na jeden ze členů výčtuBindingMode:

  • Default
  • TwoWay – data se mezi zdrojem a cílem jdou oběma způsoby.
  • OneWay — data pocházejí ze zdroje do cíle.
  • OneWayToSource — data pocházejí z cíle na zdroj.
  • OneTime — data pocházejí ze zdroje do cíle, ale pouze v případě, že se BindingContext změny změní

Obousměrné vazby

Většina vlastností s možností vázání má výchozí režim OneWay vazby, ale některé vlastnosti mají výchozí režim TwoWayvazby , včetně následujících:

Tyto vlastnosti jsou definovány jako TwoWay proto, že když se datové vazby používají se vzorem Model-View-ViewModel (MVVM), třída viewmodel je zdroj datové vazby a zobrazení, které se skládá ze zobrazení, jako Sliderje například , jsou cíle datové vazby. Vazby MVVM se podobají výše uvedenému příkladu, protože je pravděpodobné, že chcete, aby bylo každé zobrazení na stránce inicializováno s hodnotou odpovídající vlastnosti v modelu viewmodel, ale změny v zobrazení by také měly mít vliv na vlastnost viewmodel.

Jednosměrné vazby ke zdroji

Vlastnosti s možností vázání jen pro čtení mají výchozí režim vazby OneWayToSource. SelectedItem Například vlastnost ListView má výchozí režim vazby OneWayToSource. Důvodem je to, že vazba vlastnosti SelectedItem by měla vést k nastavení zdroje vazby.

Jednorázové vazby

Cílové vlastnosti s režimem OneTime vazby se aktualizují pouze v případech, kdy se kontext vazby změní. Pro vazby u těchto cílových vlastností to zjednodušuje infrastrukturu vazeb, protože není nutné monitorovat změny ve zdrojových vlastnostech.

Několik vlastností má výchozí režim vazby OneTime, včetně IsTextPredictionEnabled vlastnosti Entry.

Zobrazení modelů a oznámení o změnách vlastností

Při použití modelu viewmodel v datové vazbě je model viewmodel zdrojem datové vazby. Model viewmodel nedefinuje vlastnosti vázání, ale implementuje mechanismus oznámení, který umožňuje informovat infrastrukturu vazeb při změně hodnoty vlastnosti. Tento mechanismus oznámení je INotifyPropertyChanged rozhraní, které definuje jednu událost s názvem PropertyChanged. Třída, která implementuje toto rozhraní, obvykle aktivuje událost, když jedna z jejích veřejných vlastností změní hodnotu. Událost nemusí být vyvolána, pokud se vlastnost nikdy nezmění. Rozhraní je také implementováno INotifyPropertyChanged BindableObject a PropertyChanged událost je vyvolána vždy, když bindable vlastnost změní hodnotu.

V následujícím příkladu umožňují datové vazby vybrat barvu pomocí tří Slider prvků pro odstín, sytost a světelnost:

public class HslColorViewModel : INotifyPropertyChanged
{
    Color color;
    string name;
    float hue;
    float saturation;
    float luminosity;

    public event PropertyChangedEventHandler PropertyChanged;

    public float Hue
    {
        get
        {
            return hue;
        }
        set
        {
            if (hue != value)
            {
                Color = Color.FromHsla(value, saturation, luminosity);
            }
        }
    }

    public float Saturation
    {
        get
        {
            return saturation;
        }
        set
        {
            if (saturation != value)
            {
                Color = Color.FromHsla(hue, value, luminosity);
            }
        }        
    }

    public float Luminosity
    {
        get
        {
            return luminosity;
        }
        set
        {
            if (luminosity != value)
            {
                Color = Color.FromHsla(hue, saturation, value);
            }
        }
    }

    public Color Color
    {
        get
        {
            return color;
        }
        set
        {
            if (color != value)
            {
                color = value;
                hue = color.GetHue();
                saturation = color.GetSaturation();
                luminosity = color.GetLuminosity();
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Hue"));
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Saturation"));
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Luminosity"));
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Color"));

                Name = NamedColor.GetNearestColorName(color);
            }
        }
    }

    public string Name
    {
        get
        {
            return name;
        }
        private set
        {
            if (name != value)
            {
                name = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
            }
        }
    }
}

V tomto příkladu HslColorViewModel třída definuje Hue, , LuminositySaturation, Color, a Name vlastnosti. Když některá ze tří barevných komponent změní hodnotu, Color vlastnost se přepočítá a PropertyChanged u všech čtyř vlastností se vyvolá události. Když se Color vlastnost změní, statická GetNearestColorName metoda ve NamedColor třídě získá nejbližší pojmenovanou barvu a nastaví Name vlastnost.

Pokud je model viewmodel nastaven jako zdroj vazby, infrastruktura vazby připojí obslužnou rutinu PropertyChanged k události. Tímto způsobem lze vazbu upozornit na změny vlastností a pak nastavit cílové vlastnosti ze změněných hodnot. Pokud však cílová vlastnost (nebo Binding definice cílové vlastnosti) má hodnotu BindingMode OneTime, není nutné, aby infrastruktura vazby připojila obslužnou rutinu události PropertyChanged . Cílová vlastnost se aktualizuje pouze v případech, kdy BindingContext se změny změní, a ne když se změní samotná zdrojová vlastnost.

Následující XAML využívá HslColorViewModel:

<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.SimpleColorSelectorPage">
    <ContentPage.BindingContext>
        <local:HslColorViewModel Color="MediumTurquoise" />
    </ContentPage.BindingContext>

    <ContentPage.Resources>
        <Style TargetType="Slider">
            <Setter Property="VerticalOptions" Value="CenterAndExpand" />
        </Style>
    </ContentPage.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <BoxView Color="{Binding Color}"
                 Grid.Row="0" />
        <StackLayout Grid.Row="1"
                     Margin="10, 0">
            <Label Text="{Binding Name}"
                   HorizontalTextAlignment="Center" />
            <Slider Value="{Binding Hue}" />
            <Slider Value="{Binding Saturation}" />
            <Slider Value="{Binding Luminosity}" />
        </StackLayout>
    </Grid>
</ContentPage>

V tomto příkladu je HslColorViewModel vytvořena instance a Color vlastnost nastavena a nastavena jako stránka BindingContext. Objekty BoxView, a tři Slider zobrazení dědí kontext vazby z objektu ContentPageLabel. Tato zobrazení jsou všechny cílové vazby, které odkazují na vlastnosti zdroje v modelu viewmodel. Color Pro vlastnost a Text vlastnost BoxViewLabel, datové vazby jsou OneWay - vlastnosti v zobrazení jsou nastaveny z vlastností v modelu view. Vlastnost Value Slidervšak používá režim vazby TwoWay . To umožňuje nastavit každou Slider z modelu zobrazení a také nastavit model zobrazení z každého Sliderobjektu .

Při prvním spuštění příkladu BoxViewLabel, a tři Slider prvky jsou nastaveny z modelu viewmodel na základě počáteční Color vlastnosti set při vytvoření instance modelu viewmodel:

Simple color selector.

Při manipulaci s posuvníky se BoxView odpovídajícím Label způsobem aktualizují.

Přepsání režimu vazby

Režim vazby pro cílovou vlastnost lze přepsat nastavením Mode vlastnosti Binding (nebo Mode vlastnosti Binding rozšíření značek) na jeden ze členů výčtu BindingMode .

Nastavení Mode vlastnosti ale vždy nevygeneruje očekávaný výsledek. Například v následujícím příkladu Mode nastavení vlastnosti TwoWay nefunguje podle očekávání:

<Label Text="TEXT"
       FontSize="40"
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand"
       Scale="{Binding Source={x:Reference slider},
                       Path=Value,
                       Mode=TwoWay}" />

V tomto příkladu se může očekávat, že Slider se inicializuje na počáteční hodnotu Scale vlastnosti, což je 1, ale to se nestane. TwoWay Při inicializaci vazby se cíl nejprve nastaví ze zdroje, což znamená, že Scale vlastnost je nastavena Slider na výchozí hodnotu 0. Pokud je vazba nastavena TwoWay na Slider, pak Slider je původně nastavena ze zdroje.

Případně můžete režim vazby nastavit na OneWayToSource:

<Label Text="TEXT"
       FontSize="40"
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand"
       Scale="{Binding Source={x:Reference slider},
                       Path=Value,
                       Mode=OneWayToSource}" />

Slider Nyní je inicializován na hodnotu 1 (výchozí hodnota Scale) ale manipulace Slider s vlastností nemá vlivScale.

Poznámka:

Třída VisualElement definuje také vlastnosti ScaleX a ScaleY, které můžou měnit měřítko objektu VisualElement odlišně ve vodorovném a svislém směru.

Velmi užitečná aplikace přepsání výchozího režimu vazby s TwoWay režimem vazby SelectedItem zahrnuje vlastnost ListView. Výchozí režim vazby je OneWayToSource. Pokud je u vlastnosti nastavena SelectedItem datová vazba odkazující na zdrojovou vlastnost v modelu viewmodel, je tato zdrojová vlastnost nastavena ListView z výběru. V některých případech ale můžete chtít ListView , aby se inicializovala také z modelu viewmodel.

Důležité

Výchozí režim vazby se může lišit od ovládacího prvku po ovládací prvek a je nastaven při vytvoření vlastnosti bindable. Je k dispozici z DefaultBindingMode vlastnosti objektu BindableProperty .