Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

WPF : Le DataBinding en XAML avec {Binding}

J'ai mis un petit moment à comprendre comment fonctionnait {Binding} (en XAML), donc je vous fais part de ce que j'ai pu comprendre. On commence par un petit exemple, trouvé sur le site www.netfx3.com.

  <StackPanel Name="dpMain">
    <ListBox Name="leagueLB" DockPanel.Dock="Top"
      ItemsSource="{Binding}"
      ItemTemplate="{DynamicResource LBDataTemplate}"
      IsSynchronizedWithCurrentItem="true"/>

    <ListBox Name="divisionLB" DockPanel.Dock="Top"
      ItemsSource="{Binding Path=Divisions}"
      ItemTemplate="{DynamicResource LBDataTemplate}"
      IsSynchronizedWithCurrentItem="true"/>

    <ListBox Name="teamLB" DockPanel.Dock="Top"
      ItemsSource="{Binding Path=Divisions/Teams}"
      ItemTemplate="{DynamicResource LBDataTemplate}"
      IsSynchronizedWithCurrentItem="true"/>

    <TextBlock Text="{Binding Path=Name}"/>
  </StackPanel>

Le data template LBDataTemplate est défini comme ceci :

    <DataTemplate x:Key="LBDataTemplate">
      <TextBlock Text="{Binding Path=Name}" />
    </DataTemplate>

En gros, le DataContext du StackPanel est lié à une collection de League, chaque League contient une propriété Divisions qui est en fait une collection de Division, et chaque objet Division a une propriété Teams qui contient une collection de Team.

Si vous avez du mal a comprendre une petite capture vous aidera sûrement :

Le petit TextBox du bas affiche le nom de la League selectionnée. Pour faire ça, j'ai tapé {Binding Path=Name}, comme je n'ai pas précisé de source, c'est le DataContext qui est utilisé, ici c'est la collection de League. C'est une collection (ObservableCollection en fait) qui n'a pas de champs Name, mais alors comment se fait-il que le TextBlock affiche quelque chose ?

En fait, le moteur de Binding de WPF est "tellement intelligent" qu'il a vu que Text était lié à une collection (qui n'a pas de propriété Name) et il a directement lié Text à la propriété Name de l'element selectionné. En effet, WPF associe à chaque collection une vue par défaut, cette vue contient notament une indication sur l'élément selectionné (qui est ici modifiable en touchant au ListBox).

Ca simplifie énormément les scénarios Maitre / Détails : on peut faire en quelques lignes de XAML ce qui nécessitait plusieurs dizaines de lignes de C# en WinForms.

Et on peut faire à peu pres ce qu'on veux avec ça. Ce qu'il faut savoir c'est que lorsqu'on a le "chemin" d'une collection, on peut passer à l'élément selectionné en ajoutant "/". Par exemple, si je veux lier mon TextBlock à la collection de divisions selectionnée (dans la 2e ListBox), je tape : {Binding Path=Divisions}, le TextBlock va m'afficher (collection), puisque je l'ai lié à une collection (ObservableCollection.ToString()). Par contre pour le lier à l'élément selectionné de cette collection, je tape :  {Binding Path=Divisions/}, et là le TextBlock m'affiche SDKSample.Division (Division.ToString()). Si je veux le nom de la division selectionnée, je tape {Binding Path=Divisions/Name} (équivalent à  {Binding Path=Divisions/.Name}), WPF affiche Central.

Ce qu'il faut aussi s'avoir c'est que le point (.) permet d'accéder à une propriété. Par exemple : {Binding Path=Divisions.Count} m'affiche le nombre de divisions dans la liste de divisions (c'est bien une propriété de la collection, et pas de l'élément courant).

Aller, je vous laisse deviner ce que fait {Binding Path=/.Divisions/.Teams/.Name}...

Bon au cas où je n'ai pas été clair (ça m'étonnerais, mais bon), je résume :

  • La source par défaut est le DataContext
  • . permet d'accéder à une propriété
  • / permet d'accéder à l'élément courant d'une collection
  • /. est équivalent à /
Pour ceux qui s'intéressent au DataBinding dans WPF, je recommande le blog de Beatriz Costa qui est une vraie mine d'informations.
Publié vendredi 21 juillet 2006 15:39 par RaptorXP
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: WPF : Le DataBinding en XAML avec {Binding}

Voila qui est un bon complément à ce que j'avais déjà écrit dans mon article:
http://morpheus.developpez.com/windows-presentation-foundation

Joli travail ;)
vendredi 21 juillet 2006 19:40 by Thomas LEBRUN

# WPF : Les mod&amp;#232;les de contenus et les Templates des contr&amp;#244;les

On ne vas pas s'arr&#233;ter en si bon chemin. Je vais maintenant parler de mod&#232;les de contenu de WPF.
Une...
lundi 24 juillet 2006 16:32 by Code is poetry
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01