【问题标题】:DatePicker: month and day wrong way aroundDatePicker:月份和日期错误
【发布时间】:2016-12-19 16:56:38
【问题描述】:

我正在使用 DatePicker 来显示给定类的 DateOfBirth 属性:

<DatePicker Text="{Binding SelectedPerson.DateOfBirth }" />

我可以从基础类 (SelectedPerson) 中看到日期是正确的(即日、月和年是正确的),但在 DatePicker 中,日和月是相反的。

因此,2016 年 2 月 1 日在 DatePicker 上显示为 2016 年 1 月 2 日。

我做错了什么? 提前致谢。

【问题讨论】:

  • DateOfBirth 是 DateTIme?区域设置会影响格式。在你的情况下看起来像 NA\EU 混淆。

标签: c# wpf datepicker


【解决方案1】:

我只是简单地绑定到了错误的元素。应该是 SelectedDate,而不是 Text:

<DatePicker SelectedDate="{Binding SelectedPerson.DateOfBirth}" />

【讨论】:

  • 不。问题显示“日期选择器文本”。解决方案显示“DatePicker SelectedDate”。非常容易犯错。谢谢。
【解决方案2】:

在 WPF 中,任何未明确指定区域性的绑定都将使用不变区域性。这意味着您将获得美国日期和数字格式,而忽略您当前的区域设置。

这是一个长期存在的问题,WPF 团队认为这是“设计使然”。

standard workaround 是覆盖FrameworkElement 的Language 属性的属性元数据:

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

这需要在显示任何 UI 之前完成 - 通常在 OnStartup 事件中。

不幸的是,这只会解决派生自FrameworkElement 的元素的问题。例如,Run 元素派生自 FrameworkContentElement,因此不会受到此更改的影响。并且您不能覆盖 FrameworkContentElement 的元数据,因为它已经被覆盖了。

另一种选择是创建和使用自定义绑定,该绑定始终将文化初始化为CultureInfo.CurrentCulture:

public class CultureBinding : System.Windows.Data.Binding
{
    public CultureBinding(string path) : base(path)
    {
        ConverterCulture = CultureInfo.CurrentCulture;
    }

    public CultureBinding()
    {
        ConverterCulture = CultureInfo.CurrentCulture;
    }
}

【讨论】:

    【解决方案3】:

    我不知道你做错了什么,但作为一种解决方法,你应该尝试Date.ToString() 方法(这个here 的文档)如果你的SelectedPerson.DateOfBirth 是一个DateTime 对象(如果不是,你应该考虑这样做,只是说:p)

    编辑:您应该考虑的另一件事是设置正确的文化,请参阅here

    【讨论】:

    • 您应该永远将日期转换为字符串以掩盖格式错误。这只会让问题更糟。现在您不必处理一次错误的转换,而是有 两次 潜在的错误转换
    猜你喜欢
    • 2013-04-16
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多