Im Moment bin ich ein bisschen irritiert, wie sich WPF unter die CultureInfo verhält.
Ich verwende ein englisches Windows XP und habe im Control Panel unter Regional Options die "Standards and formats" auf German gestellt. Unter Windows Forms hat das standardmäßig dazu geführt, dass z.B: das Datum deutsch formatiert wurde. Auch Office und andere Anwendungen respektieren diese Einstellung.
Jeder Thread hat unter anderem zwei Properties: CurrentCulture und CurrentUICulture.
CurrentCulture: Das ist die Eigenschaft die ich im Control Panel eingestellt habe und bestimmt, wie Ausgaben formatiert werden. Bei mir "de-DE".
CurrentUICulture: Das ist die Sprache des Betriebssystems und bestimmt welche Elemente aus den Ressourcen verwendet werden. Quasi die Übersetzung. Bei mir "en-US".
Unter WPF kriege ich aber bisher nur die CurrentUICulture zu sehen. In meinem Fall eben "en-US". Folglich ist auch das Datum falsch formatiert. Ich möchte, dass die Einstellungen im Control Panel honoriert werden. Also basteln wir einen DateTimeConverter:
using System;
using System.Windows.Data;
using System.Globalization;
using System.Threading;
namespace CPTec.SPCat.SPCatClient
{
/// <summary>
/// Kurze Datums+Zeit Darstellung. Verwendet CurrentCulture und nicht CurrentUICulture
/// </summary>
[ValueConversion(typeof(DateTime), typeof(String))]
public class DateTimeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DateTime date = (DateTime)value;
return date.ToString("g", Thread.CurrentThread.CurrentCulture);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string strValue = value.ToString();
DateTime resultDateTime;
if (DateTime.TryParse(strValue, Thread.CurrentThread.CurrentCulture, DateTimeStyles.None, out resultDateTime))
{
return resultDateTime;
}
return value;
}
}
}
Die Klasse implementiert IValueConverter einem neuen Interface in .NET 3.0 das beim Data Binding die Konvertierung von dargestelltem Wert und gebundenem Wert in beide Richtungen erlaubt.
Das Datum wird gezielt mit dem IFormatProvider aus CurrentCulture und nicht CurrentUICulture formatiert.
Der DateTimeConverter soll in der ganzen Applikation zur Verfügung stehen, also kommt er zu den Application.Resources in App.xaml:
<Application x:Class="CPTec.SPCat.SPCatClient.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:test="clr-namespace:CPTec.SPCat.SPCatClient"
Startup="AppStartup"
>
<Application.Resources>
<test:DateTimeConverter x:Key="dateTimeConverter" />
</Application.Resources>
</Application>
Und so verwende ich diese Resource dann beispielsweise in einer GridViewColumn:
<GridViewColumn Header="Last Upload"
DisplayMemberBinding="{Binding Path=LastUpload,
Converter={StaticResource dateTimeConverter}}" />
Dabei ist LastUpload vom Typ DateTime.
Obwohl das sicher eine Lösung für das Problem ist, frage ich mich schon, wieso das sinnvolle Konzept der getrennten Einstellung von Sprache und Formatierung wieder verschwunden ist? Oder zumindest nicht standardmäßig so wie bisher funktioniert. Oder übersehe ich etwas?