WPF ValidationRule删除小数点

时间:2017-01-10 13:02:34

标签: c# wpf decimal tryparse

我有以下XAML:

            <TextBox Name="LevyWageLimitFormulaID_TextBox"
                     Width="150"
                     HorizontalAlignment="Center"
                     Grid.Row="4" Grid.Column="1">
                <TextBox.Text>
                    <Binding Path="SelectedStateRule.LevyRule.WageLimitFormulaID" 
                             UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <vm:NumericValidator ValidatesOnTargetUpdated="True" />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>

验证器定义如下:

/// <summary>
/// Numeric Validator to make sure value is numeric
/// </summary>
public class NumericValidator : ValidationRule
{
    /// <summary>
    /// Validate field is blank or contains only numbers
    /// </summary>
    /// <param name="value"></param>
    /// <param name="cultureInfo"></param>
    /// <returns></returns>
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        Decimal _number;
        if (!Decimal.TryParse((value as string), out _number) && !String.IsNullOrEmpty(value as string))
        {
            return new ValidationResult(false, "Value must be numeric");
        }

        return ValidationResult.ValidResult;
    }
}

这一切正常,直到我尝试输入十进制数字。如果我在文本框中输入'10.',小数点将被删除(用户永远不会看到小数点出现在文本框中)。如果我输入'100'然后手动移动光标并添加小数点以使值'10.0'验证起作用并保留小数点。

我知道这是由out _number的{​​{1}}部分引起的,并且一旦属性发生变化就会执行验证(这是要求之一),但是有一个修复此方法的方法,以便我可以键入Decimal.TryParse并将小数点保留在文本框中?

1 个答案:

答案 0 :(得分:1)

这不是由您的ValidationRule引起的。如果您暂时删除ValidationRule,您将遇到相同的行为。

问题是decimal源属性不能设置为除decimal值和&#34; 10之外的其他内容。&#34;确实不是有效的decimal值。

您可以做的是绑定到设置string属性的包装器decimal属性:

//add this wrapper property to your class:
private string _wrapper;
public string Wrapper
{
    get { return _wrapper; }
    set
    {
        _wrapper = value;
        decimal d;
        if (Decimal.TryParse(_wrapper, out d))
            WageLimitFormulaID = d;
    }
}

private decimal _wageLimitFormulaID;
public decimal WageLimitFormulaID
{
    get { return _wageLimitFormulaID; }
    set { _wageLimitFormulaID = value; }
}
<TextBox Name="LevyWageLimitFormulaID_TextBox"
                     Width="150"
                     HorizontalAlignment="Center"
                     Grid.Row="4" Grid.Column="1">
    <TextBox.Text>
        <Binding Path="SelectedStateRule.LevyRule.Wrapper" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <vm:NumericValidator ValidatesOnTargetUpdated="True" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>