Mode de liaison
Chaque propriété pouvant être liée à l’interface utilisateur de l’application multiplateforme .NET (.NET MAUI) a un mode de liaison par défaut défini lorsque la propriété pouvant être liée est créée et disponible à partir de la DefaultBindingMode
propriété de l’objet BindableProperty . Ce mode de liaison par défaut indique le mode en vigueur lorsque cette propriété est une cible de liaison de données. Le mode de liaison par défaut pour la plupart des propriétés, telles que Rotation
, Scale
et Opacity
, est OneWay
. Lorsque ces propriétés sont des cibles de liaison de données, la propriété cible est définie à partir de la source.
L’exemple suivant montre une liaison de données définie sur un 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>
Dans cet exemple, il Label s’agit de la source de liaison de données et de Slider la cible. La liaison référence la propriété Opacity
du Label, qui a une valeur par défaut de 1. Par conséquent, la Slider valeur 1 est initialisée à partir de la valeur initiale Opacity
de Label. Ceci est illustré dans la capture d’écran suivante :
En outre, le Slider travail continue. Cela est dû au fait que le mode de liaison par défaut de la Value
propriété est SliderTwoWay
. Cela signifie que lorsque la Value
propriété est une cible de liaison de données, la cible est définie à partir de la source, mais la source est également définie à partir de la cible. Cela permet d’être Slider défini à partir de la valeur initiale Opacity
.
Remarque
Les propriétés pouvant être liées ne signalent pas de modification de propriété, sauf si la propriété change réellement. Cela empêche une boucle infinie.
Si le mode de liaison par défaut sur la propriété cible n’est pas adapté à une liaison de données particulière, il est possible de le remplacer en définissant la Mode
propriété (ou la Mode
propriété de Binding
l’extension Binding
de balisage) sur l’un des membres de l’énumération BindingMode
:
Default
TwoWay
— les données vont de l’une à l’autre entre la source et la cibleOneWay
— les données vont de la source à la cibleOneWayToSource
— les données vont de la cible à la sourceOneTime
— les données vont de la source à la cible, mais uniquement lorsque lesBindingContext
modifications
Liaisons bidirectionnelle
La plupart des propriétés pouvant être liées ont un mode de liaison par défaut, OneWay
mais certaines propriétés ont un mode de TwoWay
liaison par défaut, y compris les éléments suivants :
- Propriété
Date
de DatePicker - Propriété
Text
de Editor, Entry, SearchBar et EntryCell - Propriété
IsRefreshing
de ListView - Propriété
SelectedItem
deMultiPage
- Propriétés
SelectedIndex
etSelectedItem
de Picker - Propriété
Value
de Slider et Stepper - Propriété
IsToggled
de Switch - Propriété
On
de SwitchCell - Propriété
Time
de TimePicker
Ces propriétés sont définies comme TwoWay
étant donné que lorsque des liaisons de données sont utilisées avec le modèle Model-View-ViewModel (MVVM), la classe viewmodel est la source de liaison de données et la vue, qui se compose de vues telles que Slider, sont des cibles de liaison de données. Les liaisons MVVM ressemblent à l’exemple ci-dessus, car il est probable que chaque affichage de la page soit initialisé avec la valeur de la propriété correspondante dans le viewmodel, mais que les modifications apportées à la vue doivent également affecter la propriété viewmodel.
Liaisons unidirectionnelle vers source
Les propriétés pouvant être liées en lecture seule disposent du mode de liaison par défaut OneWayToSource
. Par exemple, la SelectedItem
propriété d’un ListView mode de liaison par défaut est .OneWayToSource
Cela est dû au fait qu’une liaison sur la SelectedItem
propriété doit entraîner la définition de la source de liaison.
Liaisons ponctuelles
Les propriétés cibles disposant du mode de liaison OneTime
sont mises à jour uniquement lorsque le contexte de liaison change. Pour les liaisons sur ces propriétés cibles, cela simplifie l’infrastructure de liaison, car il n’est pas nécessaire de surveiller les modifications des propriétés sources.
Plusieurs propriétés ont le mode de liaison par défaut OneTime
, y compris la propriété IsTextPredictionEnabled
de Entry.
Notifications viewmodels et modifications de propriété
Lorsque vous utilisez un viewmodel dans une liaison de données, le viewmodel est la source de liaison de données. Le viewmodel ne définit pas de propriétés pouvant être liées, mais il implémente un mécanisme de notification qui permet à l’infrastructure de liaison d’être averti lorsque la valeur d’une propriété change. Ce mécanisme de notification est l’interface INotifyPropertyChanged
qui définit un événement unique nommé PropertyChanged
. Une classe qui implémente cette interface déclenche généralement l’événement quand l’une de ses propriétés publiques change de valeur. L’événement n’a pas besoin d’être déclenché si la propriété ne change jamais. L’interface INotifyPropertyChanged
est également implémentée et BindableObject un PropertyChanged
événement est déclenché chaque fois qu’une propriété pouvant être liée change de valeur.
Dans l’exemple suivant, les liaisons de données vous permettent de sélectionner une couleur à l’aide de trois Slider éléments pour la teinte, la saturation et la luminosité :
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"));
}
}
}
}
Dans cet exemple, la HslColorViewModel
classe définit Hue
, , Luminosity
Saturation
, Color
et Name
les propriétés. Lorsque l’un des trois composants de couleur change de valeur, la Color
propriété est recalculée et PropertyChanged
les événements sont déclenchés pour les quatre propriétés. Lorsque la Color
propriété change, la méthode statique GetNearestColorName
de la NamedColor
classe obtient la couleur nommée la plus proche et définit la Name
propriété.
Lorsqu’un viewmodel est défini en tant que source de liaison, l’infrastructure de liaison attache un gestionnaire à l’événement PropertyChanged
. De cette façon, la liaison peut être avertie des modifications apportées aux propriétés, puis définir les propriétés cibles à partir des valeurs modifiées. Toutefois, lorsqu’une propriété cible (ou la définition Binding
sur une propriété cible) a le BindingMode
OneTime
, l’infrastructure de liaison n’est pas tenue d’attacher un gestionnaire sur l’événement PropertyChanged
. La propriété cible est mise à jour uniquement lorsque le BindingContext
change et non pas lorsque la propriété source proprement dite change.
Le code XAML suivant utilise les HslColorViewModel
éléments suivants :
<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>
Dans cet exemple, l’instanciation HslColorViewModel
est instanciée, et Color
la propriété définie, et définie en tant que page.BindingContext
BoxView, Label et les trois vues Slider héritent du contexte de liaison de l’objet ContentPage. Ces vues sont toutes les cibles de liaison qui référencent les propriétés sources dans le viewmodel. Pour la Color
propriété du BoxView, et la Text
propriété du , les liaisons de Labeldonnées sont OneWay
: les propriétés de la vue sont définies à partir des propriétés dans le viewmodel. Toutefois, la Value
propriété de l’objet Sliderutilise un TwoWay
mode de liaison. Cela permet à chacun Slider d’être défini à partir du viewmodel, et également pour que le viewmodel soit défini à partir de chaque Slider.
Lorsque l’exemple est exécuté pour la première fois, les BoxViewéléments , Labelet trois Slider éléments sont tous définis à partir du viewmodel en fonction de la propriété initiale Color
définie lorsque le viewmodel a été instancié :
Lorsque vous manipulez les curseurs, les BoxView curseurs sont Label mis à jour en conséquence.
Substitution du mode de liaison
Le mode de liaison d’une propriété cible peut être substitué en définissant la propriété (Binding
ou la Mode
propriété de l’extension Binding
de balisage) sur l’un des membres de l’énumérationBindingMode
.Mode
Toutefois, la définition de la Mode
propriété ne produit pas toujours le résultat attendu. Par exemple, dans l’exemple suivant, la définition de la Mode
propriété TwoWay
ne fonctionne pas comme prévu :
<Label Text="TEXT"
FontSize="40"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand"
Scale="{Binding Source={x:Reference slider},
Path=Value,
Mode=TwoWay}" />
Dans cet exemple, il peut être prévu que la Slider valeur initiale de la Scale
propriété soit initialisée, qui est 1, mais cela ne se produit pas. Lorsqu’une liaison TwoWay
est initialisée, la cible est tout d’abord définie à partir de la source, ce qui signifie que la propriété Scale
est définie sur la valeur par défaut 0 de Slider. Lorsque la liaison TwoWay
est définie sur l’élément Slider, l’élément Slider est initialement défini à partir de la source.
Vous pouvez également définir le mode de liaison sur OneWayToSource
:
<Label Text="TEXT"
FontSize="40"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand"
Scale="{Binding Source={x:Reference slider},
Path=Value,
Mode=OneWayToSource}" />
À présent, l’initialisation Slider est définie sur 1 (valeur par défaut) Scale
mais la manipulation de la Slider propriété n’affecte pas la Scale
propriété.
Remarque
La classe VisualElement définit également les propriétés ScaleX
et ScaleY
, qui peuvent redimensionner l’élément VisualElement dans les directions horizontale et verticale.
Une application très utile de substitution du mode de liaison par défaut avec un TwoWay
mode de liaison implique la SelectedItem
propriété de ListView. Le mode de liaison par défaut est OneWayToSource
. Lorsqu’une liaison de données est définie sur la SelectedItem
propriété pour référencer une propriété source dans un viewmodel, cette propriété source est définie à partir de la ListView sélection. Toutefois, dans certaines circonstances, vous pouvez également souhaiter ListView l’initialisation à partir du viewmodel.
Important
Le mode de liaison par défaut peut varier du contrôle au contrôle et est défini lorsque la propriété pouvant être liée est créée. Il est disponible à partir de la DefaultBindingMode
propriété de l’objet BindableProperty .