日期选择器 System.FormatException

10

在这个日期选择器中,如果我输入一个无效的日期,比如1/1/20001(按下回车键),我会得到以下异常:

 

“System.FormatException”类型的第一次机会异常发生在mscorlib.dll中

    

附加信息:无法将字符串识别为有效的 DateTime。

但似乎是绑定引起的,我找不到处理它的方法。
在调试中,我看到上面的内容出现在屏幕上。

打开堆栈跟踪,它说错误是在SearchItem.Date1 get上抛出的,但问题是在那种情况下实际上并没有调用get。

如果我输入有效日期,比如1/1/2000,我会看到set和get都被调用。

如果我输入一个无效的日期,就不会调用set。

如果我输入一个无效的日期,然后按下回车或失去焦点,它只会恢复到之前的日期,而不会抛出异常。如果之前的日期为空,它将恢复为空。

对于我来说,这是一个严重的问题,因为如果用户输入有效日期,然后输入无效日期,日期选择器会恢复到上一个有效日期。所以用户不知道日期没有改变。

问题是我怎样才能处理无效的日期异常?

<DatePicker Width="140" DisplayDateStart="1/1/1990" DisplayDateEnd="12/31/2020" 
            SelectedDate="{Binding Path=Date1, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/>
如果我取出
, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged  

没什么改变

private DateTime? date1; 
public DateTime? Date1
{
    get
    {
        try
        {
            return date1;
        }
        catch (Exception ex)
        {
            return (DateTime?)null;
            throw;
        }
    }
    set
    {
        if (date1 != value)
        {
            date1 = value;
            NotifyPropertyChanged("Date1");    
        }
    }
}

这是 DatePickerSystem.Windows.Controls.DatePicker 吗?因为如果是的话,当我运行你的代码时没有抛出任何异常。 - Bahman_Aries
@Bahman_Aries,对我来说没有异常不是正确的方向。我需要捕获一个无效的日期。 - paparazzo
1个回答

8

我可以想到一种方法是使用DateValidationError事件:

XAML:

<DatePicker Width="140" DisplayDateStart="1/1/1990" DisplayDateEnd="12/31/2020" 
            SelectedDate="{Binding Path=Date1, Mode=TwoWay, 
            ValidatesOnExceptions=True, ValidatesOnDataErrors=True, 
            UpdateSourceTrigger=PropertyChanged}"
            DateValidationError="DatePicker_DateValidationError" />

代码后台:

private void DatePicker_DateValidationError(object sender, DatePickerDateValidationErrorEventArgs e)
{
    // throw FormatException
    e.ThrowException = true;

    //OR

    // handle the exception by showing message and clearing data
    MessageBox.Show(e.Exception.Message);
    ((DatePicker)sender).Text = null;
}

到目前为止,这看起来不错。让我进行更多的测试。谢谢。 - paparazzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接