У меня есть текстовое поле в моем представлении, где пользователь может ввести значение порта TCP.
Текстовое поле привязывается непосредственно к свойству Port модели (типа Int32), поскольку ViewModel предоставляет полную модель для привязки. Модель наследуется от ObservableObject, поэтому привязка к ней напрямую работает хорошо.
Я использую INotifyDataErrorInfo в моей модели, а свойство Port проверяет значение в установщике свойств (оно должно быть больше 0).
У меня есть кнопка в моем представлении, которая привязывается к методу HasError () модели и устанавливает его состояние IsEnabled на основе логического возвращаемого значения из HasError ()
Теперь к проблеме, если пользователь введет «Hello world», возникнет исключение, генерируемое механизмом привязки WPF. В таком случае установщик свойств никогда не выполняется, поэтому HasError () никогда не изменяется на true для такого неверного ввода.
Конечно, я мог бы установить «ValidatesOnExceptions = True» для текстового поля в представлении, чтобы хотя бы иметь текстовое поле для отображения своего шаблона ошибки проверки в этом случае, но все равно кнопка не будет отключена.
Вопрос, каково рекомендуемое решение, как обрабатывать эти случаи, когда автоматическое преобразование завершается неудачно, так что проверка ViewModel / Model никогда не выполняется?
Я бы согласился с решением, в котором проверка выполняется для строки текстового поля, а не для типа Int32, и выполняется до того, как механизм автоматического связывания WPF выполнит неудачное автоматическое преобразование типа в Int32.
Решение, которое я действительно хочу избежать, состоит в том, чтобы свойство ViewModel / Model всегда имело тип string, проверьте строку в установщике, а затем попытайтесь вручную привести ее к правильному типу (в данном случае Int32). Должно быть лучшее решение, избегающее всех таких ручных бросков.
При использовании ValidationRules можно указать механизму валидации выполнить ValidationRule перед автоматическим преобразованием. Что я действительно ищу, так это способ выполнить проверку INotifyDataErrorInfo также до того, как будет выполнено автоматическое приведение.