проверка пустого значения int на пустом TextBox - PullRequest
0 голосов
/ 06 ноября 2019

У меня TextBox привязано к свойству int с атрибутом [Required] и [Range(1, 5)], при запуске приложения TextBox получает 0, если я нажимаю Backspace и удаляючто 0, я получаю это сообщение в журнале отладки:

System.Windows.Data Error: 7 : ConvertBack cannot convert value '' (type 'String'). BindingExpression:Path=Order.PartyCode; DataItem='OrderVM' (HashCode=66572856); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') FormatException:'System.FormatException: Input string was not in a correct format.
   at System.Number.ThrowOverflowOrFormatException(ParsingStatus status, TypeCode type)
   at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at MS.Internal.Data.SystemConvertConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
   at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

и проверка не работает. Я получаю ту же ошибку, если использую Nullable<int> вместо int!

Обязательно ли иметь string свойства для работы с TextBox или есть способ решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Хотя ответ Кейта, вероятно, решит существующую проблему, тот факт, что пользователь может вводить что-либо в текстовое поле, все еще создает проблему проверки. Переменная строкового типа намного безопаснее для TextBox.Text привязки.

Если вы хотите связать со свойством int, существуют другие элементы управления, которые могут быть более подходящими. Так как ваше правило проверки допускает только значения int от 1 до 5, лучше использовать Slider, ComboBox или даже набор RadioButton с.

Если вы хотите использовать TextBox, обработайте событие KeyDown, чтобы запретить пользователю вводить нечисловые ключи.

1 голос
/ 07 ноября 2019

Вы можете исправить это, используя TargetNullValue в привязке, например:
<TextBox Text="{Binding Test, TargetNullValue=''}"/>

Это устанавливает TargetNullValue в пустую строку, которая сообщает привязке, что пустая строка должнапреобразовать в null для источника привязки.

Если вы используете обычный int, в результате ваше свойство вообще не будет установлено, когда текст будет изменен на пустую строку. Если вы используете int?, тогда ваше свойство будет установлено на null, когда текст изменится на пустую строку.

...