将无效日期转换为标准默认日期“ 01/01/1900” wpf datepicker c#

时间:2018-07-30 07:58:26

标签: c# wpf datepicker

如果我在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>

我的Datepicker的附加输出 enter image description here

如果我输入了无效的日期,则它将填充消息框并设置为默认日期“ 01/01/1900”。

2 个答案:

答案 0 :(得分:1)

如果您按照msdn的建议使用并使用

SelectedDate="{Binding Day, TargetNullValue={x:Static system:DateTime.Now}}"

https://social.msdn.microsoft.com/Forums/vstudio/en-US/7db00560-633e-42cc-b49b-a755ac3e6e59/default-date-in-datepicker?forum=wpf

如果想要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();
        }
    }
}
  • 上面的代码获取用户输入的文本值
  • 验证其是否为有效值
  • 如果验证失败,它将显示消息并重置值

对于无效日期:

enter image description here

重置后:

enter image description here