Voici une petite astuce permettant de régler un bug gênant sur Silverlight 4 lorsque l'on fait de la localisation en se servant de StringFormat dans la balise de Binding. 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:
