Accueil Nos publications Blog StringFormat du Binding & Localisation

StringFormat du Binding & Localisation


Lors de l’utilisation de StringFormat dans un Binding sur Silverlight 4 (pour une date, un nombre, etc), on s’apercoit que la culture n’est pas respectée. En effet, c’est toujours la culture invariante qui est utilisée. Nous allons voir comment rétablir cette fonctionnalité et enfin tirer partie de toute sa puissance.

Avec le code suivant:


<TextBox Grid.Column="1" Grid.Row="0" Text="{Binding Path=CurrentCulture}" IsReadOnly="True" />
<TextBox Grid.Column="1" Grid.Row="1" Text="{Binding Path=CurrentUICulture}" IsReadOnly="True" />
<TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Path=MyMoneyString}" IsReadOnly="True" />
<TextBox Grid.Column="1" Grid.Row="3" Text="{Binding Path=MyDateString}" IsReadOnly="True" />
<TextBox Grid.Column="1" Grid.Row="4" Text="{Binding Path=MyMoney, StringFormat=C2}" IsReadOnly="True" />
<TextBox Grid.Column="1" Grid.Row="5" Text="{Binding Path=MyDate, StringFormat=d}" IsReadOnly="True" />

public String CurrentCulture { get { return Thread.CurrentThread.CurrentCulture.Name; } }
public String CurrentUICulture { get { return Thread.CurrentThread.CurrentUICulture.Name; } }
public String MyMoneyString { get { return (1234.56m).ToString("C2"); } }
public Decimal MyMoney { get { return (1234.56m); } }
public String MyDateString { get { return DateTime.Now.ToString("d"); } }
public DateTime MyDate { get { return DateTime.Now; } }

Voici le comportement non conforme:

Pour remédier à ceci, il faut effectuer une manipulation un peu spéciale dans le constructeur du usercontrol.
Un usercontrol possède une propriété méconnue, le Language. Elle permet de définir la culture des contrôles de l’interface. Etrangement, sous Silverlight elle n’a pas la valeur du language de la CurrentUICulture. Fixer à la bonne valeur permet de résoudre le problème. Pour ceci il faut s’aider de la classe XmlLanguage du namespace System.Windows.Markup.


Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentUICulture.Name);

Ainsi le comportement est conforme à ce qu’on attendait: