DatePicker:日月错误的方式

时间:2016-12-19 16:56:39

标签: c# wpf datepicker

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

这是一个长期存在的问题,WPF团队认为这是设计&#34;。

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;
    }
}

答案 2 :(得分:-1)

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

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