You can use the following converter:
public class StringFormatter : IValueConverter
{
public String Format { get; set; }
public String Culture { get; set; }
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (!String.IsNullOrEmpty(Culture))
{
culture = new System.Globalization.CultureInfo(Culture);
}
else
{
culture = System.Threading.Thread.CurrentThread.CurrentUICulture;
}
if (value == null) { return value; }
if (String.IsNullOrEmpty(Format)) { return value; }
return String.Format(culture, Format, value).Trim();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Then you can set the CurrentUICulture and force the binding to change and the converter will use the new culture.
If you want to display the date in long format, declare the converter in XAML like this:
<local:StringFormatter x:Key="LongDateFormatter" Format=" {0:D}" />
And then use it in your TextBlock like this:
<TextBlock x:Name="DateText" Text="{Binding DateTime.Date, Converter={StaticResource LongDateFormatter}, Mode=OneWay}"/>
In code you can do something like this to force the binding to change:
Thread.CurrentThread.CurrentUICulture = new CultureInfo(desiredCultureString);
var tempDateTime = this.DateTime;
this.DateTime = default(DateTime);
this.DateTime = tempDateTime;
Of course there are other ways to force the change, and probably you need to change other fields to the new culture as well, but this is the general idea of how to handle it.