WPF-Validierungsregel, die die Eingabe von Dezimalstellen im Textfeld verhindert?

Ich habe ein WPF-Textfeld in XAML wie folgt definiert:

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

Wie Sie sehen, ist mein Textfeld an eine Dezimalstelle meines Geschäftsobjekts mit dem Namen UpperLeftCornerLatitude gebunden, die folgendermaßen aussieht:

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

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

Mein Benutzer gibt einen Breitengrad in dieses Textfeld ein. Um diesen Eintrag zu validieren, habe ich eine Validierungsregel erstellt, die wie folgt aussieht:

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

Mein Textfeld ist anfangs leer und am Anfang meiner Validierungsregel ist ein Haltepunkt festgelegt. Ich gebe 1 in das Textfeld ein und wenn mein Debugger innerhalb der Validierungsregel bricht, kann ich den Wert = "1" sehen. So weit, ist es gut. Jetzt laufe ich weiter und gebe einen Dezimalpunkt in das Textfeld ein (also sollten wir jetzt "1" haben). Der Debugger bricht erneut innerhalb der Überprüfungsregel und gibt erwartungsgemäß den Wert "1" ein. Wenn ich den Validierungsregelcode durchlaufe, wird angezeigt, dass er die Breitengradprüfung besteht und Folgendes zurückgibt:

new ValidationRule(true, null);

Sobald jedoch die Validierungsregel zurückgegeben wird und ich in die nächste Codezeile gehe, befinde ich mich in der ersten Zeile des Eigenschaftssetzers UpperLeftCornerLatitude. Wenn Sie hier den Mauszeiger über den Wert bewegen, wird der Wert "1" anstelle von "1" angezeigt. wie ich es erwarten würde. Wenn ich also meinen Code weiterlaufe, lande ich wieder in der Textbox und starre auf den Wert "1" anstelle von "1". Wenn ich alle Haltepunkte entferne, kann ich scheinbar kein Dezimalzeichen in das Textfeld eingeben. Fehlt hier etwas Offensichtliches, das dazu führt, dass mein Setter den Wert "1" hat, obwohl ich "1" eingegeben habe? im Textfeld? Vielen Dank!

Antworten auf die Frage(6)

Ihre Antwort auf die Frage