Вы можете использовать следующий конвертер:
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
}
Затем вы можете установить CurrentUICulture и принудительно изменить привязку, и конвертер будет использовать новую культуру.
Если вы хотите отобразить дату в длинном формате, объявите конвертер в XAML следующим образом:
<local:StringFormatter x:Key="LongDateFormatter" Format=" {0:D}" />
А затем используйте его в своем текстовом блоке так:
<TextBlock x:Name="DateText" Text="{Binding DateTime.Date, Converter={StaticResource LongDateFormatter}, Mode=OneWay}"/>
В коде вы можете сделать что-то вроде этого, чтобы принудительно изменить привязку:
Thread.CurrentThread.CurrentUICulture = new CultureInfo(desiredCultureString);
var tempDateTime = this.DateTime;
this.DateTime = default(DateTime);
this.DateTime = tempDateTime;
Конечно, есть и другие способы форсировать изменения, и, вероятно, вам нужно изменить и другие поля на новую культуру, но это общая идея, как справиться с этим.