【问题标题】:DateTime Not showing with currentculture format in Datagrid,ListViewDateTime 未在 Datagrid、ListView 中以当前区域性格式显示
【发布时间】:2023-04-08 09:59:01
【问题描述】:

在 WPF 中,我试图在 DataGrid 中绑定一个日期属性,并且我只能在它绑定到 DateTime 属性时进行排序。

应用程序应以与用户的区域和语言设置相对应的格式显示日期。

问题是当日期是string 属性时,它会根据区域设置显示,但是当属性绑定到DateTime 时,日期格式默认为美国而不是正确的区域。

因此,如果它绑定到 string 属性,则按列排序不起作用,并且如果它绑定到 DateTime 属性,它不会转换到正确的区域。

【问题讨论】:

    标签: wpf datetime listview mvvm


    【解决方案1】:

    那是因为绑定系统使用FrameworkElement.Language属性定义的文化,它不会自动匹配当前文化(这有点傻IMO,但就是这样......)。

    幸运的是,有一个简单的解决方法,您只需在应用程序静态构造函数 as shown here 中覆盖 Language 属性的元数据:

    public partial class App : Application
    {
        static App()
        {
            FrameworkElement.LanguageProperty.OverrideMetadata(
                typeof(FrameworkElement),
                new FrameworkPropertyMetadata(
                    XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
        }
    }
    

    【讨论】:

    • 非常感谢 Thomas,这正是我所期待的解决方案。但这不是 .NET Framework 中的错误。
    • 这会有所帮助,但它只是让我们获得了部分成功。 WPF 现在可以计算出我何时使用不同的文化,如 en-GB,但它仍然没有接受区域格式的更改(例如,我在我的机器上将 en-US 更改为使用 yyyy-MM-dd,但网格仍然使用 MM/dd/yyyy)。
    • 它现在确实在我的 WPF 应用程序中正确显示格式,即从 MM/dd/yyyy 到 dd/MM/yyyy,但它减少了我需要的 AM/PM 部分时间。我会继续研究。
    【解决方案2】:

    Win Application Framework (WAF)本地化示例展示了如何解决您的问题。

    【讨论】:

    • 你确定我会调查的,谢谢。
    • 对于那些希望在这里找到不同解决方案的人,他们只是使用 Thomas Levesque 提供的答案。
    【解决方案3】:

    另一个答案(覆盖语言元数据)对我有用,但对于运行应用程序只有一次。第二次调用会失败。我将其替换为:

    var wpfLanguage = XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.IetfLanguageTag);
    Application.Current.MainWindow.Language = wpfLanguage;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      相关资源
      最近更新 更多