Režim vazby
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 Rotation
je , Scale
a 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:
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 seBindingContext
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 TwoWay
vazby , včetně následujících:
Date
majetku DatePickerText
majetku Editor, , SearchBarEntryaEntryCellIsRefreshing
majetku ListViewSelectedItem
majetkuMultiPage
SelectedIndex
aSelectedItem
vlastnosti PickerValue
majetku Slider a StepperIsToggled
majetku SwitchOn
majetku SwitchCellTime
majetku TimePicker
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
, , Luminosity
Saturation
, 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:
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 .