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 ValueName 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=PropertyNameexemple .

  • 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 noms System.

  • 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 &amp; pour échapper le caractère « & ».

    • Permet &gt; 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