Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
En règle générale, les développeurs déclarent les liaisons directement dans le balisage XAML des éléments d’interface utilisateur auxquels ils souhaitent lier des données. Toutefois, vous pouvez également déclarer des liaisons dans le code. Cet article explique comment déclarer des liaisons en XAML et en code.
Conditions préalables
Avant de lire cet article, il est important que vous connaissiez le concept et l’utilisation des extensions de balisage. Pour plus d’informations sur les extensions de balisage, consultez Extensions de balisage et XAML WPF.
Cet article ne couvre pas les concepts de liaison de données. Pour une discussion sur les concepts de liaison de données, consultez la vue d’ensemble de la liaison de données.
Déclarer une liaison en XAML
Binding est une extension de balisage. Lorsque vous utilisez l’extension de liaison pour déclarer une liaison, la déclaration se compose d’une série de clauses qui suivent le Binding mot clé et séparées par des virgules (,). Les clauses de la déclaration contraignante peuvent être dans n’importe quel ordre, et il existe de nombreuses combinaisons possibles. Les clauses sont= des pairesNom Value, où Name est le nom de la Binding propriété et Value est la valeur que vous définissez pour la propriété.
Lors de la création de chaînes de déclaration de liaison dans le balisage, elles doivent être attachées à la propriété de dépendance spécifique d’un objet cible. L’exemple suivant montre comment lier la propriété TextBox.Text à l’aide de l’extension de liaison, en spécifiant les propriétés Source et Path.
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>
L’exemple précédent utilise un type d’objet de données simple de Person. L’extrait de code suivant est le code de cet objet :
class Person
{
public string Name { get; set; }
public DateTime Birthdate { get; set; }
}
Public Class Person
Public Property Name As String
Public Property Birthdate As DateTime
End Class
Vous pouvez spécifier la plupart des propriétés de la Binding classe de cette façon. Pour plus d’informations sur l’extension de liaison et pour obtenir la liste des Binding propriétés qui ne peuvent pas être définies à l’aide de l’extension de liaison, consultez la vue d’ensemble de l’extension de balisage de liaison (.NET Framework).
Pour obtenir un exemple de création d’une liaison en XAML, consultez Comment créer une liaison de données.
Syntaxe de l’élément objet
La syntaxe de l’élément objet est une alternative à la création de la déclaration de liaison. Dans la plupart des cas, il n’existe aucun avantage particulier à utiliser l’extension de balisage ou la syntaxe de l’élément objet. Toutefois, lorsque l’extension de balisage ne prend pas en charge votre scénario, par exemple lorsque la valeur de votre propriété est d’un type non chaîne pour lequel aucune conversion de type n’existe, vous devez utiliser la syntaxe de l’élément objet.
La section précédente a montré comment établir une liaison avec une extension XAML. L’exemple suivant illustre l’exécution de la même liaison, mais utilise la syntaxe de l’élément objet :
<TextBlock>
<TextBlock.Text>
<Binding Source="{StaticResource myDataSource}" Path="Name"/>
</TextBlock.Text>
</TextBlock>
Pour plus d’informations sur les différents termes, consultez La syntaxe XAML en détail (.NET Framework).
Le MultiBinding et le PriorityBinding
MultiBinding et PriorityBinding ne prennent pas en charge la syntaxe d’extension XAML. C’est pourquoi vous devez utiliser la syntaxe de l’élément objet si vous déclarez un MultiBinding ou un PriorityBinding élément en XAML.
Créer une liaison dans le code
Une autre façon de spécifier une liaison consiste à définir des propriétés directement sur un Binding objet dans le code, puis à affecter la liaison à une propriété. L’exemple suivant montre comment créer un Binding objet dans le code.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// Make a new data source object
var personDetails = new Person()
{
Name = "John",
Birthdate = DateTime.Parse("2001-02-03")
};
// New binding object using the path of 'Name' for whatever source object is used
var nameBindingObject = new Binding("Name");
// Configure the binding
nameBindingObject.Mode = BindingMode.OneWay;
nameBindingObject.Source = personDetails;
nameBindingObject.Converter = NameConverter.Instance;
nameBindingObject.ConverterCulture = new CultureInfo("en-US");
// Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject);
}
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
' Make a new data source object
Dim personDetails As New Person() With {
.Name = "John",
.Birthdate = Date.Parse("2001-02-03")
}
' New binding object using the path of 'Name' for whatever source object is used
Dim nameBindingObject As New Binding("Name")
' Configure the binding
nameBindingObject.Mode = BindingMode.OneWay
nameBindingObject.Source = personDetails
nameBindingObject.Converter = NameConverter.Instance
nameBindingObject.ConverterCulture = New CultureInfo("en-US")
' Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject)
End Sub
Le code précédent applique les éléments suivants à la liaison :
- Chemin d’accès de la propriété sur l’objet source de données.
- Mode de la liaison.
- La source de données, dans ce cas, une instance d’objet simple représentant une personne.
- Convertisseur facultatif qui traite la valeur entrante à partir de l’objet source de données avant d’être affecté à la propriété cible.
Lorsque l’objet que vous liez est un FrameworkElement ou un FrameworkContentElement, vous pouvez appeler la SetBinding méthode directement sur votre objet au lieu d’utiliser BindingOperations.SetBinding. Pour obtenir un exemple, consultez Guide pratique pour créer une liaison dans le code.
L’exemple précédent utilise un type d’objet de données simple de Person. Voici le code de cet objet :
class Person
{
public string Name { get; set; }
public DateTime Birthdate { get; set; }
}
Public Class Person
Public Property Name As String
Public Property Birthdate As DateTime
End Class
Syntaxe du chemin de liaison
Utilisez la Path propriété pour spécifier la valeur source à lier à :
Dans le cas le plus simple, la Path valeur de la propriété est le nom de la propriété de l’objet source à utiliser pour la liaison, comme par exemple
Path=PropertyName.Les sous-propriétés d’une propriété peuvent être spécifiées par une syntaxe similaire comme en C#. Par exemple, la clause
Path=ShoppingCart.Orderdéfinit la liaison sur la sous-propriétéOrderde l’objet ou de la propriétéShoppingCart.Pour établir une liaison à une propriété jointe, placez les parenthèses autour de la propriété jointe. Par exemple, pour établir une liaison à la propriété DockPanel.Dockjointe, la syntaxe est
Path=(DockPanel.Dock).Les indexeurs d’une propriété peuvent être spécifiés entre crochets en suivant le nom de propriété où l’indexeur est appliqué. Par exemple, la clause
Path=ShoppingCart[0]définit la liaison à l’index qui correspond à la façon dont l’indexation interne de votre propriété gère la chaîne littérale « 0 ». Les indexeurs imbriqués sont également pris en charge.Les indexeurs et les sous-propriétés peuvent être mélangés dans une
Pathclause ; par exemple,Path=ShoppingCart.ShippingInfo[MailingAddress,Street].À l’intérieur des indexeurs. Vous pouvez avoir plusieurs paramètres d’indexeur séparés par des virgules (
,). Le type de chaque paramètre peut être spécifié entre parenthèses. Par exemple, vous pouvez avoirPath="[(sys:Int32)42,(sys:Int32)24]", oùsysest mappé à l’espace de nommageSystem.Lorsque la source est une vue de collection, l’élément actuel peut être spécifié avec une barre oblique (
/). Par exemple, la clausePath=/définit la liaison à l’élément actif dans l’affichage. Lorsque la source est une collection, cette syntaxe spécifie l’élément actuel de la vue de collection par défaut.Les noms de propriétés et les slashs peuvent être combinés pour parcourir les propriétés qui sont des collections. Par exemple,
Path=/Offices/ManagerNamespécifie l’élément actuel de la collection source, qui contient uneOfficespropriété qui est également une collection. Son élément actuel est un objet qui contient uneManagerNamepropriété.Si vous le souhaitez, un chemin de période (
.) peut être utilisé pour établir une liaison à la source actuelle. Par exemple,Text="{Binding}"équivaut àText="{Binding Path=.}".
Mécanisme d’échappement
À l'intérieur des indexeurs (
[ ]), le caractère circonflexe (^) échappe au caractère suivant.Si vous définissez Path en XAML, vous devez également échapper (à l’aide d’entités XML) certains caractères spéciaux à la définition du langage XML :
Permet
&d’échapper au caractère «&».Utilisez
>pour échapper à la balise de fin «>».
En outre, si vous décrivez la liaison entière dans un attribut à l’aide de la syntaxe d’extension de balisage, vous devez échapper (à l’aide d’une barre oblique inverse
\) des caractères spéciaux à l’analyseur d’extension de balisage WPF :Barre oblique inverse (
\) constitue le caractère d'échappement en soi.Le signe égal (
=) sépare le nom de propriété de la valeur de propriété.Virgule (
,) sépare les propriétés.L'accolade droite (
}) est la fin d'une extension de balisage.
Sens de la liaison
Utilisez la Binding.Mode propriété pour spécifier la direction de la liaison. Les modes suivants sont disponibles pour les actualisations de liaison :
| Mode de liaison | Descriptif |
|---|---|
| BindingMode.TwoWay | Met à jour la propriété cible ou la propriété source chaque fois que l'une d'elles change. |
| BindingMode.OneWay | Met à jour la propriété cible uniquement lorsque la propriété source change. |
| BindingMode.OneTime | Met à jour la propriété cible uniquement lorsque l’application démarre ou quand elle DataContext subit une modification. |
| BindingMode.OneWayToSource | Met à jour la propriété source lorsque la propriété cible change. |
| BindingMode.Default | Provoque l’utilisation de la valeur par défaut Mode de la propriété cible. |
Pour plus d’informations, consultez l’énumération BindingMode .
L’exemple suivant montre comment définir la Mode propriété :
<TextBlock Name="IncomeText" Text="{Binding Path=TotalIncome, Mode=OneTime}" />
Pour détecter les modifications de source (applicables aux liaisons OneWay et TwoWay), la source doit implémenter un mécanisme de notification de changement de propriété approprié tel que INotifyPropertyChanged. Pour plus d’informations, consultez Fournir des notifications de modification.
Pour les liaisons TwoWay ou OneWayToSource, vous pouvez contrôler le moment des mises à jour de la source en définissant la propriété UpdateSourceTrigger. Pour plus d’informations, consultez UpdateSourceTrigger.
Comportements par défaut
Le comportement par défaut est le suivant s’il n’est pas spécifié dans la déclaration :
Un convertisseur par défaut est créé qui tente d’effectuer une conversion de type entre la valeur source de liaison et la valeur cible de liaison. Si une conversion ne peut pas être effectuée, le convertisseur par défaut retourne
null.Si vous ne définissez ConverterCulturepas, le moteur de liaison utilise la
Languagepropriété de l’objet cible de liaison. En XAML, la valeur par défaut esten-USou elle hérite de la valeur de l'élément racine (ou de n'importe quel élément) de la page, si une valeur a été définie explicitement.Tant que la liaison possède déjà un contexte de données (par exemple, le contexte de données hérité provenant d’un élément parent), et que l’élément ou la collection retourné par ce contexte convient à la liaison sans nécessiter de modification supplémentaire du chemin d’accès, une déclaration de liaison peut ne comporter aucune clause du tout :
{Binding}. Il s’agit souvent de la façon dont une liaison est spécifiée pour le style des données, où la liaison agit sur une collection. Pour plus d’informations, consultez Utilisation d’objets entiers comme source de liaison.La valeur par défaut Mode varie entre un mode de liaison unidirectionnel ou bidirectionnel en fonction de la propriété de dépendance liée. Vous pouvez toujours déclarer le mode de liaison explicitement pour vous assurer que votre liaison a le comportement souhaité. En général, les propriétés de contrôle modifiables par l'utilisateur, telles que TextBox.Text et RangeBase.Value, sont par défaut des liaisons bidirectionnelles, mais la plupart des autres propriétés sont par défaut des liaisons unidirectionnelles.
La valeur par défaut UpdateSourceTrigger varie entre PropertyChanged et LostFocus dépend également de la propriété de dépendance liée. La valeur par défaut de la plupart des propriétés de dépendance est PropertyChanged, tandis que la TextBox.Text propriété a une valeur par défaut .LostFocus
Voir aussi
- Vue d’ensemble de la liaison de données
- Vue d'ensemble des sources de liaison
- Création d’une liaison de données
- PropertyPath : Syntaxe XAML (.NET Framework)
.NET Desktop feedback