TOC

This article has been localized into French by the community.

Data binding:

La propriété StringFormat

Comme nous l'avons vu dans les chapitres précédents, c'est à travers l'utilisation d'un convertisseur que l'on peut manipuler la valeur de sortie d'un binding avant qu'elle ne soit affichée. Ce qui est bien à propos des convertisseurs, c'est qu'ils permettent de convertir n'importe quel type de donnée en un type complètement différent. Cependant, pour des cas plus simples, où vous souhaitez juste changer la manière dont une valeur est affichée et ne pas forcément la convertir en un type différent, la propriété StringFormat pourrait s'avérer amplement suffisante.

En utilisant la propriété StringFormat d'un binding, vous perdez un peu de flexibilité offerte par l'utilisation d'un convertisseur mais en retour, son utilisation est beaucoup plus simple et n'implique pas la création d'une nouvelle classe dans un nouveau fichier.

La propriété StringFormat fait exactement ce que son nom suggère : Elle formate le texte en appelant la fonction String.Format. Quelquefois, un exemple vaut mieux que mille mots. Donc, on va voir un exemple:

<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="StringFormatSample" Height="150" Width="250"
		Name="wnd">
	<StackPanel Margin="10">
		<TextBlock Text="{Binding ElementName=wnd, Path=ActualWidth, StringFormat=Window width: {0:#,#.0}}" />
		<TextBlock Text="{Binding ElementName=wnd, Path=ActualHeight, StringFormat=Window height: {0:C}}" />
		<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Date: {0:dddd, MMMM dd}}" />
		<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Time: {0:HH:mm}}" />
	</StackPanel>
</Window>

Les deux premiers TextBlock obtiennent leur valeur par un binding à la fenêtre parent, récupérant ainsi sa largeur et sa hauteur. Au travers de la propriété StringFormat, les valeurs sont formatées. Pour la largeur nous définissons un format personnalisé et pour la hauteur nous lui demandons d'utiliser le format de devises, juste pour le fun. La valeur est stockée en tant que type "double", ce qui signifie que l'on peut utiliser les mêmes spécificateurs de format que si nous avions appelé double.ToString(). Vous trouverez une liste de tous ceux-ci ici : http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Remarquez aussi comment j'ai pu inclure du texte personnalisé dans le StringFormat. Cela permet d'ajouter du texte avant ou après la valeur du binding comme bon vous semble. Quand on fait référence à la valeur actuelle à l'intérieur de la chaine de formatage, on l’entoure d'une paire d'accolades, ce qui inclus deux valeurs : une référence à la valeur que l'on veut formater (la valeur numéro 0, qui est la première valeur possible) et la chaine de formatage, séparés par une virgule.

Pour les deux dernières valeurs, nous lions simplement la date courante (DateTime.Now) et on l'affiche une première fois en temps que date, dans un format spécifique, et ensuite comme un temps (heures et minutes), encore une fois en utilisant notre propre format prédéfinit. Vous pouvez en apprendre davantage à propos de formatage d'un DateTime ici : http://msdn.microsoft.com/en-us/library/az4se3k1.aspx

Formatage sans texte supplémentaire

Sachez toutefois que si vous spécifiez une chaine de format qui n'inclus aucun texte supplémentaire - ce que tous les exemples au dessus font - alors vous devez ajouter une paire d'accolades supplémentaire quand vous la définissez dans XAML. La raison est que WPF pourrait sinon confondre la syntaxe avec celle utilisée pour les Markup Extensions. Voici un exemple :

<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="StringFormatSample" Height="150" Width="250"
		Name="wnd">
	<WrapPanel Margin="10">
		<TextBlock Text="Width: " />
		<TextBlock Text="{Binding ElementName=wnd, Path=ActualWidth, StringFormat={}{0:#,#.0}}" />
	</WrapPanel>
</Window>

Utilisation d'une Culture spécifique

Si vous avez besoin d'afficher la valeur d'un binding selon une culture (options linguistiques) spécifique, ce n'est pas un problème. Le binding utilisera la langue définie pour l'élément parent, ou bien vous pouvez la spécifier directement pour le binding en utilisant la propriété ConverterCulture. Voici un exemple :

<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatCultureSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="StringFormatCultureSample" Height="120" Width="300">
	<StackPanel Margin="10">
		<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='de-DE', StringFormat=German date: {0:D}}" />
		<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='en-US', StringFormat=American date: {0:D}}" />
		<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='ja-JP', StringFormat=Japanese date: {0:D}}" />
	</StackPanel>
</Window>

C'est très simple. En combinant la propriété StringFormat, qui utilise le spécificateur D (format de date long), et la propriété ConverterCulture, nous pouvons afficher les valeurs selon une culture spécifique. Plutôt chouette !


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!