Alex Rivera | Logout

WPF XAML StringFormat DateTime: Output in wrong culture?

Asked 2009-06-30T07:07:43.753
69

I'm having some trouble with the output of a DateTime value. My computer's current culture is set to de-AT (Austria).

The following code

string s1 = DateTime.Now.ToString("d");
string s2 = string.Format("{0:d}", DateTime.Now);

results in s1 and s2 both having the correct value of "30.06.2009".

But when using the same format in XAML

    <TextBlock Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat=d}"/>

the output is `"6/30/2009". It seems the XAML StringFormat ignores the current culture settings. This happens on both Vista and XP.

I don't want to specify a custom format, because the output should be formatted in the user's preferred culture setting.

Anybody with the same problem? Is this a bug in WPF?

Edit
Report

1 Answer

1

you could use an IValueConverter (which takes in a culture parameter) and format the value as you wish, something I like is this nullable converter by Matt Hamilton

class NullableDateTimeConverter : ValidationRule, IValueConverter
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        if (value == null || value.ToString().Trim().Length == 0) return null;

        return new ValidationResult( 
            ConvertBack(value, typeof(DateTime?), null, cultureInfo) != DependencyProperty.UnsetValue,
            "Please enter a valid date, or leave this value blank");
    }

    #region IValueConverter Members
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return "";
        DateTime? dt = value as DateTime?;
        if (dt.HasValue)
        {
            return parameter == null ? dt.Value.ToString() : dt.Value.ToString(parameter.ToString());
        }
        return ""; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || value.ToString().Trim().Length == 0) return null;
        string s = value.ToString();

        if (s.CompareTo("today") == 0) return DateTime.Today;
        if (s.CompareTo("now") == 0) return DateTime.Now;
        if (s.CompareTo("yesterday") == 0) return DateTime.Today.AddDays(-1);
        if (s.CompareTo("tomorrow") == 0) return DateTime.Today.AddDays(1);

        DateTime dt; 
        if (DateTime.TryParse(value.ToString(), out dt)) return dt; 

        return DependencyProperty.UnsetValue; 
    }  
    #endregion
}  

heres the original

answered 2009-06-30T07:52:56.050

Your Answer