如果我在WPF日期选择器中输入“ 2018年2月30日”或“ 14/9/2018”或任何无效日期,则应将其转换为标准默认日期“ 01/01/1900”,并在可能的情况下还给消息框“无效日期” ”。 我的XML代码是:
<DatePicker x:Name="DatePicker1" SelectedDateFormat="Short" Margin="10,10,10,0" Grid.ColumnSpan="5"
IsTodayHighlighted="True" RenderTransformOrigin="0.129,-2.84" PreviewTextInput="DatePicker1_PreviewTextInput"
DateValidationError="DatePicker1_DateValidationError"
DisplayDateStart="1/1/1990" SelectedDate="{x:Static sys:DateTime.Now}" LostFocus="DatePicker1_LostFocus" Height="28" VerticalAlignment="Top" CalendarOpened="DatePicker1_CalendarOpened" >
<DatePicker.Resources>
<Style TargetType="{x:Type DatePickerTextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<TextBox x:Name="PART_TextBox"
Text="{Binding SelectedDate, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}, StringFormat=dd-MMM-yyyy}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DatePicker.Resources>
</DatePicker>
如果我输入了无效的日期,则它将填充消息框并设置为默认日期“ 01/01/1900”。
答案 0 :(得分:1)
如果您按照msdn的建议使用并使用
SelectedDate="{Binding Day, TargetNullValue={x:Static system:DateTime.Now}}"
如果想要1990年1月1日,可以将后者替换为您自己的绑定,或者将DateTime.MinValue替换为您自己的绑定,如果您想要显示那不是一个正确的日期,则显示该日期吗?
关于对用户的反馈,您也许可以选择类似的
SelectedDate="{Binding Day, FallbackValue={x:Static sys:DateTime.Today}}"
^表示如果绑定由于任何原因而失败(例如无效的日期),它应该退回到您设置绑定的位置。在这种情况下,DateTime.Today。
也许您可以通过在日期时间旁边放置一个标签来解决信息,该标签在日期无效时可见吗?还是使用DateTime组件的HintText?
希望这是您追求的解决方案类型!
答案 1 :(得分:0)
您有一个LostFocus
事件处理程序:DatePicker1_LostFocus
您可以在事件处理程序中添加验证逻辑:
private void DatePicker1_LostFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource is TextBox textBox)
{
var val = textBox.Text;
if(!DateTime.TryParse(val, out var dateTimeVal))
{
MessageBox.Show($"The entered value ({val}) is not valid.");
textBox.Text = new DateTime(1900, 1, 1).ToShortDateString();
}
}
}
对于无效日期:
重置后: