Vue d'ensemble des déclarations de liaison
Cette rubrique décrit les différentes façons dont vous pouvez déclarer une liaison.
Prérequis
Avant de lire cette rubrique, il est important de vous familiariser avec 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.
Cette rubrique ne couvre pas les concepts de liaison de données. Pour une présentation des concepts de liaison de données, consultez la page Vue d’ensemble de la liaison de données.
Déclarer une liaison en XAML
Cette section explique comment déclarer une liaison en XAML.
Utilisation de l’extension de balisage
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 suivant le mot-clé Binding
et séparées par des virgules (,). Les clauses dans la déclaration de liaison peuvent être dans n’importe quel ordre et il existe de nombreuses combinaisons possibles. Les clauses sont =des paires Nom Value où Name est le nom de la Binding propriété et Value est la valeur que vous définissez pour la propriété.
Lorsque vous créez des chaînes de déclaration de liaison dans le balisage, elles doivent être jointes à la propriété de dépendance spécifique d’un objet cible. L’exemple suivant montre comment lier la TextBox.Text propriété à l’aide de l’extension de liaison, en spécifiant les propriétés et Path les Source propriétés.
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>
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, ainsi que 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.
Syntaxe de l’élément objet
La syntaxe d’élément objet est une alternative à la création de la déclaration de liaison. Dans la plupart des cas, il n’existe pas d’avantage particulier à l’utilisation de l’extension de balisage ou de la syntaxe d’élément objet. Toutefois, dans le cas où l’extension de balisage ne prend pas en charge votre scénario, par exemple lorsque la valeur de propriété est d’un type hors chaîne pour lequel aucune conversion n’existe, vous devez utiliser la syntaxe d’élément objet.
Voici un exemple d’utilisation de la syntaxe d’élément objet et de l’extension de balisage :
<TextBlock Name="myconvertedtext"
Foreground="{Binding Path=TheDate,
Converter={StaticResource MyConverterReference}}">
<TextBlock.Text>
<Binding Path="TheDate"
Converter="{StaticResource MyConverterReference}"/>
</TextBlock.Text>
</TextBlock>
L’exemple lie la Foreground propriété en déclarant une liaison à l’aide de la syntaxe d’extension. La déclaration de liaison de la Text propriété utilise la syntaxe de l’élément objet.
Pour plus d’informations sur les différents termes, consultez Syntaxe XAML en détail.
MultiBinding et PriorityBinding
MultiBinding et PriorityBinding ne prennent pas en charge la syntaxe d’extension XAML. Par conséquent, vous devez utiliser la syntaxe de l’élément objet si vous déclarez un MultiBinding ou un PriorityBinding élément en XAML.
Création d’une liaison dans le code
Une autre façon de spécifier une liaison consiste à définir des propriétés directement sur un objet dans le Binding code. L’exemple suivant montre comment créer un Binding objet et spécifier les propriétés dans le code. Dans cet exemple, TheConverter
est un objet qui implémente l’interface IValueConverter .
private void OnPageLoaded(object sender, EventArgs e)
{
// Make a new source, to grab a new timestamp
MyData myChangedData = new MyData();
// Create a new binding
// TheDate is a property of type DateTime on MyData class
Binding myNewBindDef = new Binding("TheDate");
myNewBindDef.Mode = BindingMode.OneWay;
myNewBindDef.Source = myChangedData;
myNewBindDef.Converter = TheConverter;
myNewBindDef.ConverterCulture = new CultureInfo("en-US");
// myDatetext is a TextBlock object that is the binding target object
BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);
lbChooseCulture.SelectedIndex = 0;
}
Private Sub OnPageLoaded(ByVal sender As Object, ByVal e As EventArgs)
' Make a new source, to grab a new timestamp
Dim myChangedData As New MyData()
' Create a new binding
' TheDate is a property of type DateTime on MyData class
Dim myNewBindDef As New Binding("TheDate")
myNewBindDef.Mode = BindingMode.OneWay
myNewBindDef.Source = myChangedData
myNewBindDef.Converter = TheConverter
myNewBindDef.ConverterCulture = New CultureInfo("en-US")
' myDatetext is a TextBlock object that is the binding target object
BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef)
BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef)
lbChooseCulture.SelectedIndex = 0
End Sub
Si l’objet que vous liez est un FrameworkElement ou un FrameworkContentElement que vous pouvez appeler la SetBinding
méthode directement sur votre objet au lieu d’utiliser BindingOperations.SetBinding. Pour un exemple, consultez Créer une liaison dans du code.
Syntaxe de 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, par
Path=PropertyName
exemple .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.Order
définit la liaison à la sous-propriétéOrder
de l’objet ou la propriétéShoppingCart
.Pour lier à une propriété jointe, placez des parenthèses autour de la propriété. Par exemple, pour établir une liaison à la propriété DockPanel.Dockjointe, la syntaxe est
Path=(DockPanel.Dock)
.Des indexeurs de propriété peuvent être spécifiés entre crochets après le nom de la 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 combinés en une clause
Path
; 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é avec des parenthèses. Par exemple, vous pouvez avoir
Path="[(sys:Int32)42,(sys:Int32)24]"
, oùsys
est mappé à l’espace de nomsSystem
.Lorsque la source est une vue de collection, l’élément actuel peut être spécifié avec une barre oblique (/). Par exemple, la clause
Path=/
définit la liaison à l’élément actuel dans la vue. Lorsque la source est une collection, cette syntaxe spécifie l’élément actuel de la vue de collection par défaut.Les barres obliques et les noms de propriété peuvent être combinés pour parcourir les propriétés qui sont des collections. Par exemple,
Path=/Offices/ManagerName
spécifie l’élément actuel de la collection source, qui contient une propriétéOffices
qui est également une collection. Son élément actuel est un objet qui contient une propriétéManagerName
.Éventuellement, un chemin d’accès ayant la valeur point (.) peut servir à lier à la source actuelle. Par exemple,
Text="{Binding}"
équivaut àText="{Binding Path=.}"
.
Mécanisme d’échappement
À l’intérieur des indexeurs ([]), l’accent circonflexe (^) échappe le 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 :
Utilisez
&
pour échapper le caractère « & ».Permet
>
d’é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 de barres obliques inverses \) caractères spéciaux à l’analyseur d’extension de balisage WPF :
Barre oblique inverse (\) est le caractère d’échappement lui-même.
Le signe égal (=) sépare le nom de la valeur de la propriété.
La virgule (,) sépare les propriétés.
L’accolade fermante (}) se place à la fin d’une extension de balisage.
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 de valeur par défaut est créé pour effectuer une conversion de type entre la valeur de source de liaison et la valeur de 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
Language
propriété de l’objet cible de liaison. En XAML, cette valeur par défaut est « en-US » ou hérite de la valeur de l’élément racine (ou tout élément) de la page, s’il a été défini 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 qu’un élément ou une collection que ce contexte renvoie est approprié pour la liaison sans nécessiter de modification supplémentaire du chemin d’accès, une déclaration de liaison peut n’avoir aucune clause du tout :
{Binding}
il s’agit souvent de la manière dont une liaison est spécifiée pour les styles de données, où la liaison agit sur une collection. Pour plus d’informations, consultez la section « Objets entiers utilisés comme source de liaison » dans la Vue d’ensemble des sources de liaison.La valeur par défaut Mode varie entre une méthode unidirectionnelle et bidirectionnelle en fonction de la propriété de dépendance liée. Vous pouvez toujours déclarer explicitement le mode de liaison pour garantir 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 les RangeBase.Valueliaisons bidirectionnelle, et la plupart des autres propriétés sont par défaut des liaisons unidirectionnelle.
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 celle de la propriété TextBox.Text a comme valeur par défaut LostFocus.
Voir aussi
.NET Desktop feedback