DatePicker 绑定到 DateTime。 “字符串未被识别为有效的日期时间”

Posted

技术标签:

【中文标题】DatePicker 绑定到 DateTime。 “字符串未被识别为有效的日期时间”【英文标题】:DatePicker bound to a DateTime. "String was not recognized as a valid DateTime" 【发布时间】:2012-05-02 03:05:58 【问题描述】:

(免责声明:此异常已在许多其他线程中报告过,是的,我在 Google 上四处搜索,试图找到解决我的问题的方法!!)

我有一个 WPF 应用程序,WPF Toolkit DatePicker 控件绑定到 DateTime 变量:

<UserControl x:Class="MikesApp.View.UserControls.FXRatesUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:toolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit">

 <toolkit:DatePicker x:Name="fxDate" VerticalAlignment="Center" 
         Text="Binding Selected_FXRate_Date, Mode=TwoWay" 
         Style="DynamicResource DatePickerStyle1" >
 </toolkit:DatePicker>

每当我输入一个日期,例如 2012 年 4 月 20 日,DatePicker 控件似乎认为它实际上是英国日期格式 (dd/MM/yyyy),并且 WPFtoolkit 源代码会抛出“字符串未被识别为有效的日期时间。"

这会突然阻止 WPF 向应用程序的其他部分执行更改通知,这些部分需要知道此日期何时更改。

Screenshot of VS2010 exception

我很困惑。

我的笔记本电脑设置为以 MM/dd/yyyy 格式显示日期,我特别尝试告诉我的应用使用这种美国日期格式,首先使用以下代码:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "MMM-dd-yyyy";
Thread.CurrentThread.CurrentCulture.DateTimeFormat.LongDatePattern = "MMM-dd-yyyy  hh:mm:ss";   

然后,出于绝望,使用以下代码:

CultureInfo ci = new CultureInfo("en-US");
ci.DateTimeFormat.SetAllDateTimePatterns(new string[]  "MM/dd/yyyy" , 'd' );
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

但无论我尝试什么,只要我选择无法使用 dd/MMM/yyyy 解析的日期,DatePicker 都会引发异常。

如果我查看引发异常的代码行(取自 WPF Toolkit SDK 中的 DatePicker.cs):

newSelectedDate = DateTime.Parse(text, DateTimeHelper.GetDateFormat(DateTimeHelper.GetCulture(this)));

..我发现“DateTimeHelper.GetCulture(this)”确实正确返回了“en-US”,但是 GetDateFormat 函数出现了错误日期格式。它以某种方式返回 dd/MMM/yyyy,而不是 MMM/dd/yyyy。

GetDateFormat's return values

我真的很困惑。

我什至尝试将 GetDateFormat 函数(取自 WPFtoolkit 源代码中的以下路径)剪切'n'粘贴到我的应用程序中,并试图让它重现“错误的日期”格式”问题...但是当它在我的代码中时,它运行良好,并且每次都正确解析 MMM/dd/yyyy 日期。

WPFtoolkit\Calendar\Microsoft\Windows\Controls\DateTimeHelper.cs

为什么 WPFtoolkit 代码与使用它的 WPF 应用程序代码具有不同的文化?

我怎样才能让 WPFtoolkit 使用正确的文化?

【问题讨论】:

顺便提一下,我的笔记本电脑的区域设置设置为“英语(美国)”...在任何建议我应该检查之前! 【参考方案1】:

我知道这不是直接的答案,但以防万一它可能会有所帮助,您是否可以使用 Telerik 工具?他们的 RadDateTimePicker 具有可以设置/强制执行的 Culture 依赖属性(CultureInfo 类型):

<telerik:RadDateTimePicker x:Name="fxDate" VerticalAlignment="Center" 
     Culture ="Binding Culture"
     Text="Binding Selected_FXRate_Date, Mode=TwoWay" 
     Style="DynamicResource DatePickerStyle1" >

另外,我很确定您会说“当然不是”,但以防万一,您是否正在做类似覆盖 DatePickerStyle1 中的模板之类的操作,这可能会导致 TemplateBinding 关闭?

【讨论】:

感谢您的回复。不,我的 DatePicker 声明中没有任何内容会改变与文化有关的任何内容。请记住,它确实获得了正确的文化(en-US),但随后却获得了这种文化的错误日期格式......这让我感到困惑。我不打算研究 Telerik 工具,我确实有一个备用计划,如果没有人可以建议 WPFtoolkit 友好的解决方案! 嗯,这简直是一团糟。我会把你的问题记在心里,以防我白天看到什么,但祝你好运。 我能想到的唯一其他方法是在绑定中扔一个转换器来强制格式...

以上是关于DatePicker 绑定到 DateTime。 “字符串未被识别为有效的日期时间”的主要内容,如果未能解决你的问题,请参考以下文章

WPF DatePicker 显示 DateTime.Today 或绑定

可为空的 DateTime 的 Datepicker 绑定不正确

Mudblazor DatePicker 绑定仅以一种方式工作

Jquery datepicker 和 php datetime 不同意?

WPF DatePicker:自定义显示文本

WPF DatePicker 更改月份时抛出异常