为全局独立于CultureInfo - WPF的所有DateTime对象设置StringFormat

问题描述 投票:2回答:1

有没有办法在我的WPF应用程序中独立于StringFormat为全局DateTime对象设置CultureInfo

我在整个应用程序中使用绑定到这种对象,如下所示:

<DataGridTextColumn Header="Date" Binding="{Binding Date}"/>    

我想避免必须将StringFormat参数添加到每个绑定。我试图覆盖当前的文化DateTimeFormat参数,如下所示:

public void SetDateTimeFormat()
{
    culture = Thread.CurrentThread.CurrentUICulture;
    var newCulture = new CultureInfo(culture.Name);

    // Set desired date format here
    newCulture.DateTimeFormat.ShortDatePattern = "dd/MMM/YYYY";
    newCulture.DateTimeFormat.LongDatePattern = "dd/MMM/YYYY";
    newCulture.DateTimeFormat.ShortTimePattern = "dd/MMM/YYYY";
    newCulture.DateTimeFormat.LongTimePattern = "dd/MMM/YYYY";
    newCulture.DateTimeFormat.FullDateTimePattern = "dd/MMM/YYYY";

    CultureInfo.DefaultThreadCurrentCulture = newCulture;
    CultureInfo.DefaultThreadCurrentUICulture = newCulture;

    Thread.CurrentThread.CurrentCulture = newCulture;
    Thread.CurrentThread.CurrentUICulture = newCulture;

        FrameworkElement.LanguageProperty.OverrideMetadata(
            typeof(FrameworkElement),
            new FrameworkPropertyMetadata(System.Windows.Markup.XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

        var lang = System.Windows.Markup.XmlLanguage.GetLanguage(newCulture.IetfLanguageTag);
        FrameworkContentElement.LanguageProperty.OverrideMetadata(
              typeof(System.Windows.Documents.TextElement),
              new FrameworkPropertyMetadata(lang)
            );
}

但它不起作用

c# wpf datetime datetime-format cultureinfo
1个回答
2
投票

有没有办法在我的WPF应用程序中独立于StringFormat为全局所有DateTime对象设置CultureInfo

一个DateTime对象没有任何StringFormatBinding有。您可以创建自定义Binding类:

public class MyCustomBinding : Binding
{
    public MyCustomBinding(string path)
        :base(path)
    {
        StringFormat = "yyyy-MM-dd";
    }
}

用法:

<DataGridTextColumn Header="Date" Binding="{local:MyCustomBinding Date}"/>

或者您可以设置元素的Language属性:

<DataGrid x:Name="dg" Language="en">

您也可以对App.xaml.cs中的所有元素进行全局操作:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        var culture = new CultureInfo("en");
        FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), 
            new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag)));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.