DatePicker System.FormatException

В этом DatePicker, если я ввожу недопустимую дату, например
1/1/20001 (введите ключ)
, я получаю следующее исключение

Возникло первое случайное исключение типа «System.FormatException» в mscorlib.dll.

Дополнительная информация: строка не была распознана как допустимый DateTime.

Но похоже, что это вызывается привязкой, и я не могу найти способ справиться с этим.
В отладке я получаю на экране вышеприведенное

Включил трассировку стека, и он говорит, что ошибка выдается на SearchItem.Date1 get
Но проблема в том, что get фактически не вызывается в этой ситуации.

Если я ввожу правильную дату, например 01.01.2000, я вижу и набор, и вызов.

Если я ввожу неверную дату, нет вызова для установки.

Если я ввожу неверную дату и нажимаю ввод или теряю фокус, просто возвращается к предыдущей дате и не генерирует исключение. Если предыдущая дата была нулевой, она возвращается к нулевой.

Для меня это критическая проблема, если пользователь вводит действительную дату, а затем вводит недопустимую дату, DatePicker просто возвращается к последней действительной дате. Таким образом, пользователь не знает, что дата не изменилась.

Вопрос в том, как я могу обработать исключение недопустимой даты?

<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");    
        }
    }
}

person paparazzo    schedule 23.12.2014    source источник
comment
Это DatePicker, System.Windows.Controls.DatePicker? потому что, если это так, при запуске вашего кода не возникает никаких исключений.   -  person Bahman_Aries    schedule 20.05.2015
comment
@Bahman_Aries не исключение, это неправильное направление для меня. Мне нужно поймать недопустимую дату.   -  person paparazzo    schedule 20.05.2015


Ответы (1)


Один из способов, который я могу придумать, - это использовать событие 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;
}
person Bahman_Aries    schedule 20.05.2015
comment
Пока это выглядит хорошо. Позвольте мне сделать еще несколько тестов. И спасибо. - person paparazzo; 20.05.2015