Se in un applicazionew Windows Forms scrivo una cosa del genere:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DateTime dt = new DateTime(2008, 07, 06);
label1.DataBindings.Add(new Binding("Text", dt, null));
}
}
ottengo come risultato una label che contenente: “06/07/2008 00:00:00”
Proviamo ora l’equivalente WPF ovvero:
<Window x:Class="WpfApplication4.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="Window1" Height="300" Width="300">
<Grid>
<TextBlock Text="{Binding}" >
<TextBlock.DataContext>
<sys:DateTime>2008/07/06</sys:DateTime>
</TextBlock.DataContext>
</TextBlock>
</Grid>
</Window>
In questo caso il Texblock contiene: “7/6/2008 12:00:00 AM”, ovvero malgrado i regional settings siano impostati su Italia, WPF sembra ignorarne le impostazioni.
Forzando la cultura del Textblock a “it-IT” in questo modo:
<TextBlock Language="it-IT" Text="{Binding}" >
il tutto viene rispettato e il TextBlock riporta “06/07/2008 0.0.00”.
A quanto pare, in assenza di un impostazione implicita i FrameworkElements usano la cultura di default che “guarda caso” è “en-US”.
Il modo più elegante, per allineare la cultura è sicuramente quello di modificare il valore predefinito della proprietà Language da “en-US” a quella del sistema operativo modificando i metadati della proprietà LanguageProperty allo startup usando questo codice:
public partial class App : Application
{
public App()
{
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
}
}
Questo è necessario anche se avete installato il SP1.