¿Regla de validación de WPF que impide la entrada decimal en el cuadro de texto?

Tengo un cuadro de texto WPF definido en XAML como este:

<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 puede ver, mi cuadro de texto está vinculado a una propiedad decimal en mi objeto de negocio llamado UpperLeftCornerLatitude que se ve así:

private decimal _upperLeftCornerLongitude;
public decimal UpperLeftCornerLatitude
{
    get { return _upperLeftCornerLongitude; }
    set
    {
        if (_upperLeftCornerLongitude == value)
        {
            return;
        }

        _upperLeftCornerLongitude = value;
        OnPropertyChanged(new PropertyChangedEventArgs("UpperLeftCornerLatitude"));
    }
}

Mi usuario ingresará un valor de latitud en este cuadro de texto y para validar esa entrada, he creado una regla de validación que se parece a esto:

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);
    }
}

Mi cuadro de texto inicialmente comienza vacío y tengo un punto de interrupción establecido al principio de mi regla de validación. Ingreso 1 en el cuadro de texto y cuando mi depurador se rompe dentro de la regla de validación, puedo ver ese valor = "1". Hasta ahora tan bueno. Ahora continúo ejecutando e ingrese un punto decimal en el cuadro de texto (por lo que deberíamos tener "1" ahora). Nuevamente, el depurador se rompe dentro de la regla de validación y, como se esperaba, value = "1". Si paso por el código de la regla de validación, veo que pasa la verificación del valor de latitud y devuelve lo siguiente:

new ValidationRule(true, null);

Sin embargo, tan pronto como la regla de validación regresa y paso a la siguiente línea de código, me encuentro en la primera línea de mi establecedor de propiedades UpperLeftCornerLatitude. Si se sobrepasa el valor aquí, se revela que es un valor de "1" en lugar de "1". como yo esperaria Así que, naturalmente, cuando continúo ejecutando mi código, termino de nuevo en el cuadro de texto mirando un valor de "1" en lugar de "1". Si elimino todos los puntos de interrupción, el efecto es que parece que no puedo ingresar un punto decimal en el cuadro de texto. ¿Hay algo obvio que me esté perdiendo aquí y que haga que mi configurador termine con un valor de "1" aunque haya ingresado "1"? en el cuadro de texto? ¡Muchas gracias!

Respuestas a la pregunta(6)

Su respuesta a la pregunta