Regra de validação do WPF que impede entrada decimal na caixa de texto?
Eu tenho uma caixa de texto WPF definida em XAML assim:
<Window.Resources>
<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<TextBox x:Name="upperLeftCornerLatitudeTextBox" Style="{StaticResource textBoxInError}">
<TextBox.Text>
<Binding Path="UpperLeftCornerLatitude" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:LatitudeValidationRule ValidationStep="RawProposedValue"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Como você pode ver, minha caixa de texto está vinculada a uma propriedade decimal no meu objeto de negócios chamada UpperLeftCornerLatitude que se parece com isso:
private decimal _upperLeftCornerLongitude;
public decimal UpperLeftCornerLatitude
{
get { return _upperLeftCornerLongitude; }
set
{
if (_upperLeftCornerLongitude == value)
{
return;
}
_upperLeftCornerLongitude = value;
OnPropertyChanged(new PropertyChangedEventArgs("UpperLeftCornerLatitude"));
}
}
Meu usuário digitará um valor de latitude nesta caixa de texto e, para validar essa entrada, criei uma regra de validação parecida com esta:
public class LatitudeValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
decimal latitude;
if (decimal.TryParse(value.ToString(), out latitude))
{
if ((latitude < -90) || (latitude > 90))
{
return new ValidationResult(false, "Latitude values must be between -90.0 and 90.0.");
}
}
else
{
return new ValidationResult(false, "Latitude values must be between -90.0 and 90.0.");
}
return new ValidationResult(true, null);
}
}
Minha caixa de texto começa inicialmente vazia e eu tenho um ponto de interrupção definido no início da minha regra de validação. Entro 1 na caixa de texto e quando meu depurador quebra dentro da regra de validação, vejo esse valor = "1". Por enquanto, tudo bem. Agora continuo executando e insiro um ponto decimal na caixa de texto (portanto, devemos ter o "1." agora). Novamente, o depurador quebra dentro da regra de validação e, como esperado, valor = "1". Se eu percorrer o código da regra de validação, vejo que ele passa na verificação do valor de latitude e retorna o seguinte:
new ValidationRule(true, null);
No entanto, assim que a regra de validação retorna e eu passo para a próxima linha de código, me encontro na primeira linha do meu configurador de propriedades UpperLeftCornerLatitude. Passar o mouse sobre o valor aqui revela que é um valor de "1" em vez de "1". como eu esperaria. Então, naturalmente, quando continuo executando meu código, acabo de volta na caixa de texto, com o valor de "1" em vez de "1.". Se eu remover todos os pontos de interrupção, o efeito é que não consigo inserir um ponto decimal na caixa de texto. Existe alguma coisa óbvia que eu estou perdendo aqui que está fazendo com que meu setter termine com o valor "1", mesmo que eu tenha inserido "1". na caixa de texto? Muito obrigado!