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!

questionAnswers(6)

yourAnswerToTheQuestion