Reguła sprawdzania poprawności WPF uniemożliwiająca wpis dziesiętny w polu tekstowym?

Mam pole tekstowe WPF zdefiniowane w XAML tak:

<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>

Jak widać, moje pole tekstowe jest powiązane z właściwością dziesiętną w moim obiekcie biznesowym o nazwie UpperLeftCornerLatitude, która wygląda tak:

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

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

Mój użytkownik wprowadzi wartość szerokości geograficznej do tego pola tekstowego, a w celu zatwierdzenia tego wpisu utworzyłem regułę sprawdzania poprawności, która wygląda tak:

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

Moje pole tekstowe początkowo jest puste, a na początku reguły sprawdzania poprawności mam punkt przerwania. Wprowadzam 1 w polu tekstowym i kiedy mój debugger łamie regułę sprawdzania poprawności, widzę, że wartość = „1”. Jak na razie dobrze. Teraz kontynuuję pracę i wprowadzam kropkę dziesiętną w polu tekstowym (więc powinniśmy mieć teraz „1.”). Ponownie debuger łamie regułę sprawdzania poprawności i, zgodnie z oczekiwaniami, wartość = „1.”. Jeśli przejdę przez kod reguły sprawdzania poprawności, widzę, że przechodzi sprawdzanie wartości szerokości i zwraca następujące informacje:

new ValidationRule(true, null);

Jednak gdy tylko reguła sprawdzania poprawności powróci i wkroczę do następnego wiersza kodu, znajduję się w pierwszym wierszu mojego selektora właściwości UpperLeftCornerLatitude. Mousing over value pokazuje, że jest to wartość „1” zamiast „1.” jak bym się spodziewał. Naturalnie, gdy kontynuuję uruchamianie mojego kodu, wracam do pola tekstowego, patrząc na wartość „1” zamiast „1.”. Jeśli usunę wszystkie punkty przerwania, efektem jest to, że nie mogę wprowadzić kropki dziesiętnej w polu tekstowym. Czy jest coś oczywistego, czego mi brakuje tutaj, co powoduje, że mój setter ma wartość „1”, mimo że wprowadziłem „1.” w polu tekstowym? Dziękuję bardzo!

questionAnswers(6)

yourAnswerToTheQuestion