Tryb wiązania
Każda właściwość powiązana interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI) ma domyślny tryb powiązania ustawiony podczas tworzenia właściwości możliwej do powiązania, która jest dostępna we DefaultBindingMode
właściwości BindableProperty obiektu. Ten domyślny tryb powiązania wskazuje tryb obowiązujący, gdy ta właściwość jest obiektem docelowym powiązania danych. Domyślny tryb powiązania dla większości właściwości, takich jak Rotation
, Scale
i Opacity
to OneWay
. Gdy te właściwości są obiektami docelowymi powiązania danych, właściwość docelowa jest ustawiana ze źródła.
W poniższym przykładzie pokazano powiązanie danych zdefiniowane na obiekcie Slider:
<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>
W tym przykładzie Label element jest źródłem powiązania danych, a Slider elementem docelowym. Powiązanie odwołuje się do Opacity
właściwości Label, która ma wartość domyślną 1. W związku z tym parametr Slider jest inicjowany do wartości 1 z początkowej Opacity
Labelwartości . Jest to pokazane na poniższym zrzucie ekranu:
Ponadto Slider nadal działają. Jest to spowodowane tym, że domyślnym trybem powiązania dla Value
właściwości elementu Slider jest TwoWay
. Oznacza to, że gdy Value
właściwość jest obiektem docelowym powiązania danych, element docelowy jest ustawiany ze źródła, ale źródło jest również ustawione z obiektu docelowego. Slider Umożliwia to ustawienie wartości początkowejOpacity
.
Uwaga
Właściwości możliwe do powiązania nie sygnalizują zmiany właściwości, chyba że właściwość rzeczywiście ulegnie zmianie. Zapobiega to nieskończonej pętli.
Jeśli domyślny tryb powiązania we właściwości docelowej nie jest odpowiedni dla określonego powiązania danych, można go zastąpić, ustawiając Mode
właściwość (lub Mode
właściwość Binding
Binding
rozszerzenia znaczników) na jeden z elementów członkowskich BindingMode
wyliczenia:
Default
TwoWay
— dane idą w obie strony między źródłem a obiektem docelowymOneWay
— dane przechodzą ze źródła do miejsca docelowegoOneWayToSource
— dane przechodzą z miejsca docelowego do źródłaOneTime
— dane przechodzą ze źródła do miejsca docelowego, ale tylko wtedy, gdyBindingContext
zmiany
Powiązania dwukierunkowe
Większość właściwości możliwych do powiązania ma domyślny tryb powiązania, ale niektóre właściwości mają domyślny tryb OneWay
TwoWay
powiązania , w tym następujące:
Date
właściwość DatePickerText
Editorwłaściwość , , EntrySearchBariEntryCellIsRefreshing
właściwość ListViewSelectedItem
właściwośćMultiPage
SelectedIndex
właściwości iSelectedItem
PickerValue
właściwość i SliderStepperIsToggled
właściwość SwitchOn
właściwość SwitchCellTime
właściwość TimePicker
Te właściwości są definiowane jako TwoWay
, ponieważ gdy powiązania danych są używane ze wzorcem Model-View-ViewModel (MVVM), klasa viewmodel jest źródłem powiązania danych, a widok, który składa się z widoków, takich jak Slider, są obiektami docelowymi powiązania danych. Powiązania MVVM przypominają powyższy przykład, ponieważ prawdopodobnie każdy widok na stronie ma zostać zainicjowany z wartością odpowiedniej właściwości w modelu viewmodel, ale zmiany w widoku również powinny mieć wpływ na właściwość viewmodel.
Powiązania jednokierunkowe do źródła
Właściwości możliwe do powiązania tylko do odczytu mają domyślny tryb OneWayToSource
powiązania . Na przykład właściwość obiektu SelectedItem
ListView ma domyślny tryb OneWayToSource
powiązania . Dzieje się tak, ponieważ powiązanie właściwości SelectedItem
powinno spowodować ustawienie źródła powiązania.
Powiązania jednorazowe
Właściwości docelowe z trybem OneTime
powiązania są aktualizowane tylko wtedy, gdy kontekst powiązania ulegnie zmianie. W przypadku powiązań dla tych właściwości docelowych upraszcza to infrastrukturę powiązania, ponieważ nie jest konieczne monitorowanie zmian we właściwościach źródłowych.
Kilka właściwości ma domyślny tryb OneTime
powiązania , w tym IsTextPredictionEnabled
właściwość Entry.
Wyświetlanie modelu i powiadomień o zmianie właściwości
W przypadku korzystania z modelu viewmodel w powiązaniu danych model viewmodel jest źródłem powiązania danych. Model widoku nie definiuje właściwości możliwych do powiązania, ale implementuje mechanizm powiadomień, który umożliwia powiadamianie infrastruktury powiązania o zmianie wartości właściwości. Ten mechanizm powiadomień jest interfejsem INotifyPropertyChanged
, który definiuje jedno zdarzenie o nazwie PropertyChanged
. Klasa, która implementuje ten interfejs, zwykle uruchamia zdarzenie, gdy jedna z jego właściwości publicznych zmienia wartość. Zdarzenie nie musi być zgłaszane, jeśli właściwość nigdy się nie zmienia. Interfejs INotifyPropertyChanged
jest również implementowany przez BindableObject program i PropertyChanged
zdarzenie jest wywoływane za każdym razem, gdy wartość właściwości możliwej do powiązania zmienia się.
W poniższym przykładzie powiązania danych umożliwiają wybranie koloru przy użyciu trzech Slider elementów odcienia, nasycenia i jasności:
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"));
}
}
}
}
W tym przykładzie HslColorViewModel
klasa definiuje Hue
właściwości , Saturation
, Luminosity
, Color
i Name
. Gdy dowolny z trzech składników kolorów zmienia wartość, Color
właściwość jest obliczana ponownie, a PropertyChanged
zdarzenia są wywoływane dla wszystkich czterech właściwości. Color
Gdy właściwość ulegnie zmianie, metoda statyczna GetNearestColorName
w NamedColor
klasie uzyskuje najbliższy nazwany kolor i ustawia Name
właściwość .
Gdy model widoku jest ustawiony jako źródło powiązania, infrastruktura powiązania dołącza procedurę obsługi do zdarzenia PropertyChanged
. W ten sposób powiązanie może zostać powiadomione o zmianach właściwości, a następnie ustawić właściwości docelowe ze zmienionych wartości. Jednak jeśli właściwość docelowa (lub Binding
definicja we właściwości docelowej) ma BindingMode
OneTime
wartość , nie jest konieczne, aby infrastruktura powiązania dołączała program obsługi w PropertyChanged
zdarzeniu. Właściwość docelowa jest aktualizowana tylko wtedy, gdy BindingContext
zmienia się, a nie wtedy, gdy sama właściwość źródłowa ulegnie zmianie.
Poniższy kod XAML korzysta z elementu 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>
W tym przykładzie element HslColorViewModel
jest tworzone wystąpienie, a Color
właściwość ustawiana jako BindingContext
element . Widoki BoxView, Labeli trzy Slider dziedziczą kontekst powiązania z klasy ContentPage. Te widoki to wszystkie obiekty docelowe powiązania odwołujące się do właściwości źródła w modelu widoku. Color
Dla właściwości BoxView, i Text
właściwości Label, powiązania danych to OneWay
— właściwości w widoku są ustawione z właściwości w modelu viewmodel. SliderWłaściwość Value
, jednak używa TwoWay
trybu powiązania. Dzięki temu każda Slider z nich może być ustawiona na podstawie modelu widoku, a także, aby model widoku był ustawiany z każdego Sliderelementu .
Po pierwszym uruchomieniu przykładu BoxViewwszystkie elementy , Labeli trzy Slider elementy są ustawiane z modelu viewmodel na podstawie początkowej Color
właściwości ustawionej podczas tworzenia wystąpienia modelu viewmodel:
W miarę manipulowania suwakami kontrolki BoxView i Label są odpowiednio aktualizowane.
Zastępowanie trybu powiązania
Tryb powiązania dla właściwości docelowej można zastąpić, ustawiając Mode
właściwość Binding
(lub Mode
właściwość Binding
rozszerzenia znaczników) na jeden z elementów BindingMode
członkowskich wyliczenia.
Jednak ustawienie Mode
właściwości nie zawsze generuje oczekiwany wynik. Na przykład w poniższym przykładzie ustawienie Mode
właściwości TwoWay
na wartość nie działa zgodnie z oczekiwaniami:
<Label Text="TEXT"
FontSize="40"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand"
Scale="{Binding Source={x:Reference slider},
Path=Value,
Mode=TwoWay}" />
W tym przykładzie można się spodziewać, że Slider właściwość zostanie zainicjowana do początkowej Scale
wartości właściwości, która wynosi 1, ale tak się nie stanie. TwoWay
Po zainicjowaniu powiązania element docelowy jest ustawiany z pierwszego źródła, co oznacza, że Scale
właściwość jest ustawiona na wartość domyślną Slider 0. TwoWay
Gdy powiązanie jest ustawione na Sliderobiekcie , Slider element jest początkowo ustawiany ze źródła.
Alternatywnie można ustawić tryb powiązania na OneWayToSource
:
<Label Text="TEXT"
FontSize="40"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand"
Scale="{Binding Source={x:Reference slider},
Path=Value,
Mode=OneWayToSource}" />
Teraz parametr Slider jest inicjowany na 1 (wartość Scale
domyślna ) ale manipulowanie właściwością Slider nie ma wpływu na Scale
właściwość .
Uwaga
Klasa VisualElement definiuje również właściwości ScaleX
i ScaleY
, które umożliwiają skalowanie klasy VisualElement w różny sposób poziomo i pionowo.
Bardzo przydatna aplikacja przesłaniania domyślnego trybu powiązania z trybem TwoWay
powiązania obejmuje SelectedItem
właściwość ListView. Domyślnym trybem powiązania jest OneWayToSource
. Gdy powiązanie danych jest ustawione na SelectedItem
właściwości w celu odwołania się do właściwości źródłowej w modelu viewmodel, właściwość źródłowa jest ustawiana z zaznaczenia ListView . Jednak w niektórych okolicznościach można również zainicjować element ListView z modelu widoków.
Ważne
Domyślny tryb powiązania może się różnić od kontrolki do kontrolki i jest ustawiany po utworzeniu właściwości możliwej do powiązania. Jest on dostępny we DefaultBindingMode
właściwości BindableProperty obiektu.