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.

Technorati Tags: ,