无法输入“。”在带有十进制绑定的文本框中

时间:2017-05-28 23:55:57

标签: c# wpf data-binding

我有一个绑定到十进制值(属性)的文本框,当我输入“3”时它不允许我进入,因为它将它解析回3,因此我失去了“。”。我试过像Delay / LostFocus等解决方案,但这对我来说不起作用,来自WPF validation rule preventing decimal entry in textbox?

我现在写了一个IValueConverter类,我显然没有正确地做到这一点。这是代码:

[ValueConversion(typeof(decimal), typeof(string))]
public class DecimalToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //return Decimal.Parse(value.ToString());
        if (value == null) return Decimal.Zero;
        if (!(value is string)) return value;
        string s = (string)value;
        int dotCount = s.Count(f => f == '.');
        Decimal d;
        bool parseValid = Decimal.TryParse(s, out d);
        System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("^[-+]?([0-9]*?[.])?[0-9]*$");
        bool b = regex.IsMatch(s);
        if (dotCount == 1 && b)
        {
            return s;
        }
        return d;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null ? value.ToString() : "";
    }
}

XAML

<TextBox x:Name="ValueTextBox" Grid.Column="0" Grid.RowSpan="2" VerticalContentAlignment="Center" Text ="{Binding Value, Converter={StaticResource DecimalToStringConverter}}" PreviewTextInput="ValueTextBox_OnPreviewTextInput"  TextWrapping="Wrap" MouseWheel="ValueTextBox_MouseWheel" PreviewKeyDown="ValueTextBox_PreviewKeyDown" PreviewKeyUp="ValueTextBox_PreviewKeyUp" TextChanged="ValueTextBox_TextChanged" BorderThickness="1,1,0,1"/>

请告知我如何纠正这个... 感谢

3 个答案:

答案 0 :(得分:1)

太烦人了。你不能按“。”但是如果你移回一个角色就可以了。这是因为“21”不是有效的小数。

对我来说,我最终放弃了,并使该字段成为一个字符串。必须有一个更好的方法,但它让我超越了我的用例问题。然后你还需要检查以确保它是一个数字等,但至少用户体验是他们所期望的。

答案 1 :(得分:0)

尝试像这样处理PreviewTextInput事件(仅限):

<TextBox x:Name="ValueTextBox" Grid.Column="0" Grid.RowSpan="2" VerticalContentAlignment="Center"
    Text ="{Binding Value}" PreviewTextInput="ValueTextBox_PreviewTextInput" />
private void ValueTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    decimal value;
    e.Handled = string.IsNullOrEmpty(e.Text) || !decimal.TryParse($"{ValueTextBox.Text}{e.Text}",
        System.Globalization.NumberStyles.Any,
        System.Globalization.CultureInfo.InvariantCulture, out value);
}

答案 2 :(得分:0)

尝试一下

这将只允许在文本框中输入小数,而不能输入其他任何内容。

viewmodel看起来像这样:

@babel/polyfill

XAML的用法如下:

@babel/polyfill