我有一个WPF应用程序,我使用绑定到实体框架(带有SQL服务器)实体的日期字段的日期选择器。我把它绑定如下:
<DatePicker x:Name="dtComplete" Style="{StaticResource FTC_DatePicker}" Grid.Column="2" Grid.Row="7" Grid.ColumnSpan="3"
Text="{Binding dtComplete, Mode=TwoWay, ValidatesOnDataErrors=True}"/>
绑定工作正常,可以更新到实体。
我的问题是,当底层数据库字段为空时,我得到选择一个日期水印,这是我想要的,但该水印正在验证并返回为不是日期格式。我想保留水印,但在用户更改输入之前没有验证触发器。另外,我想保留ValidatesOnDataErrors=True
,因为我在其他地方使用它来评估业务逻辑。
要查看我的意思,这里是一个使用datepicker和日期为空值的表单,您可以看到验证错误:
调试时的输出窗口提供以下验证转换错误:
System.Windows.Data错误:7:ConvertBack无法转换值'' (输入'String')。 BindingExpression:路径= dtComplete; 的DataItem = 'job_BF0D6052EEADCDA3C2B6D1A174D77C322D5AB16A035F214705610767131A80F0' (的HashCode = 17930557);目标元素是'DatePicker' (名称= 'dtComplete'); target属性是'Text'(类型'String') FormatException:'System.FormatException:String未被识别为 有效的DateTime。在System.DateTime.Parse(String s, System.Convert.ToDateTime(String。的IFormatProvider提供者) 价值,IFormatProvider提供者)at System.Convert.ChangeType(Object value,Type conversionType, IFormatProvider提供商) System.Windows.Data.BindingExpression.ConvertBackHelper(的IValueConverter converter,Object value,Type sourceType,Object parameter, CultureInfo culture)'
在用户更改输入之前,有人可以帮助我摆脱此验证错误吗?
提前致谢
答案 0 :(得分:6)
想出来:
我绑定了hte datePicker的文本值,所以它试图将水印文本验证为日期,但我真正应该做的是绑定到selectedDate属性,如下所示:
<DatePicker x:Name="dtComplete" Style="{StaticResource FTC_DatePicker}" Grid.Column="2" Grid.Row="7" Grid.ColumnSpan="3"
SelectedDate="{Binding dtComplete, Mode=TwoWay, ValidatesOnDataErrors=True}" />
现在按照我的意愿行事,选择日期水印仍然存在且绑定日期值有效。它现在太明显了。简单修复
答案 1 :(得分:1)
问题实际上是,日期选择器的标准行为是使用所选值来突出显示日历上的日期。由于您在value属性中放置了非日期值,因此在激活日历时,它不知道该怎么做。打开日期选择器日历时会触发一个事件“下拉列表”。您可以在打开后将值设置为今天,这将删除您的错误 我不清楚的是你是如何在第一时间显示该文本的。我认为datepicker验证了输入的任何值。