O WPF TextBox vinculado não está atualizando o valor quando a propriedade vinculada impõe algumas regras de negócios
Estou usando o .NET 4.0. Eu tenho um código muito simples que permite ao usuário digitar um número entre 1 e 99.999 (inclusive). Eu tenho alguma lógica no configurador de propriedades que impede que o valor mais recente seja aplicado se ele não aderir às regras de negócios (por exemplo, não é um número ou o número é muito grande).
public class MainViewModel : INotifyPropertyChanged
{
#region Fields
private string _text = string.Empty;
#endregion // Fields
#region Properties
public string Text
{
get { return _text; }
set
{
if (_text == value) return;
if (IsValidRange(value))
{
_text = value;
}
OnPropertyChanged("Text");
}
}
#endregion // Properties
#region Private Methods
private bool IsValidRange(string value)
{
// An empty string is considered valid.
if (string.IsNullOrWhiteSpace(value)) return true;
// We try to convert to an unsigned integer, since negative bill numbers are not allowed,
// nor are decimal places.
uint num;
if (!uint.TryParse(value, out num)) return false;
// The value was successfully parse, so we know it is a non-negative integer. Now, we
// just need to make sure it is in the range of 1 - 99999, inclusive.
return num >= 1 && num <= 99999;
}
#endregion // Private Methods
#region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion // INotifyPropertyChanged Implementation
}
O problema que encontro é que, quando o valor não é válido e apenas o ignoro, o TextBox vinculado a essa propriedade não é atualizado para refletir essa alteração; em vez disso, apenas retém o valor conforme é digitado. Aqui está como eu tenho a propriedade vinculada:
<TextBox Grid.Row="0"
Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
Alguém pode me dizer o que estou fazendo de errado?
Eu li muitas perguntas que pareciam muito semelhantes a isso, mas nenhuma das respostas funcionou para mim. O estranho é que, quando eu não valido com base em números, mas apenas altero todo o texto digitado para maiúsculo, ele funciona muito bem. Apenas parece não funcionar quando tento não definir a propriedade com o novo valor.