We are trying to allow the app to have its culture set at runtime and optionally override the way dates are displayed.
We create our own culture with:
private CultureInfo CreateCulture()
{
// start with basic culture object
CultureInfo culture = Sys.Workspace.ServerProperties.UICulture ?? new CultureInfo(Properties.Settings.Default.DefaultCulture);
// override data format
var dateFmt = Sys.Workspace.ServerProperties.DateFormatOverride;
if (!string.IsNullOrEmpty(dateFmt))
{
culture.DateTimeFormat.ShortDatePattern = dateFmt;
culture.DateTimeFormat.LongDatePattern = dateFmt;
if (dateFmt.Contains("/")) culture.DateTimeFormat.DateSeparator = "/";
if (dateFmt.Contains("-")) culture.DateTimeFormat.DateSeparator = "-";
}
return culture;
}
Then in the initialization of the app we do:
var culture = CreateCulture();
// set ui culture
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = culture;
// set WPF culture
LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag)));
We set the "Sys.Workspace.ServerProperties.DateFormatOverride" value to be "dd-MMM-yyyy". This doesn't seem to be respected by the bindings though. For example:
<TextBlock TextAlignment="Center" HorizontalAlignment="Stretch"
Text="{Binding NoteDate, StringFormat={}{0:d}}" />
The NoteDate is a DataColumn with type of DateTime but displays the default cultures shortdate pattern.
If I set the main culture to en-GB I will get dd-mm-yyyy, if I set it to en-US I will get mm-dd-yyyy.
When I look at the Thread.CurrentThread.CurrentCulture and currentUICulture it is set correctly, i.e. it is en-gb and the shortdatepattern and longdatepattern are dd-MMM-yyyy but the dates do not display in this format.