Вы используете UpdateSourceTrigger=PropertyChanged
, что означает, что каждый раз, когда пользователь нажимает клавишу, он сохраняет данные в контексте данных
Например, пользователь вводит 2
, тогда ваша собственность равна "2"
. Пользователь вводит b
, и он пытается заменить "2"
на "2b"
, что не удается, поэтому первоначальное свойство "2"
остается.
Удалите UpdateSourceTrigger
, и он вернется к значению по умолчанию LostFocus
, что означает, что он будет обновлять свойство только тогда, когда TextBox теряет фокус.
Вы можете установить свойство на null
при возникновении ошибки, но я бы не рекомендовал делать это, потому что тогда, если пользователь случайно нажмет неправильный ключ, TextBox
будет очищен.
В качестве примечания используйте IDataErrorInfo
для всей проверки, а не только для проверки бизнес-правил. WPF создан для работы с ним. Мои модели используют его для проверки правильности длины, типа и т. Д., А мои ViewModels используют его для проверки соблюдения бизнес-правил
Редактировать
Альтернативное предложение, которое у меня было бы, - привязать к строковому значению, а не к числовому полю. Таким образом, когда значение изменяется, вы можете попробовать привести его к вашему Int и вернуть ошибку, если оно не может быть приведено.
public class SomeObject : IDataErrorInfo
{
public string SomeString { get; set; }
public Int32? SomeNumber { get; set; }
#region IDataErrorInfo Members
public string Error
{
get { throw new NotImplementedException(); }
}
public string this[string columnName]
{
get
{
if (columnName == "SomeString")
{
int i;
if (int.TryParse(SomeString, i))
{
SomeNumber = i;
}
else
{
SomeNumber = null;
return "Value is not a valid number";
}
}
return null;
}
}
#endregion
}