仅允许WPF文本框中的数字输入

时间:2010-11-03 09:06:06

标签: c# wpf validation mvvm

我想验证用户输入以确保它们是整数。我该怎么做?我想过使用IDataErrorInfo这似乎是在WPF中进行验证的“正确”方法。所以我尝试在我的ViewModel中实现它。

但问题是我的文本框绑定了一个整数字段,并且没有必要验证int是否为int。我注意到WPF会自动在文本框周围添加红色边框,以通知用户错误。基础属性不会更改为无效值。但我想通知用户这个。我该怎么办?

5 个答案:

答案 0 :(得分:14)

另一种方法是不允许非整数的值。 以下实现有点糟糕,我想稍后对其进行抽象,以使其更具可重用性,但这就是我所做的:

在我视图中的代码中(我知道如果你是一个铁杆mvvm可能会受伤; o)) 我定义了以下功能:

  private void NumericOnly(System.Object sender, System.Windows.Input.TextCompositionEventArgs e)
{
    e.Handled = IsTextNumeric(e.Text);

}


private static bool IsTextNumeric(string str)
{
    System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("[^0-9]");
    return reg.IsMatch(str);

}

在XAML视图中,每个只应该接受整数的文本框 定义如下:

   <TextBox Padding="2"  TextAlignment="Right" PreviewTextInput="NumericOnly" Text="{Binding xxx.yyyy}" MaxLength="1" />

关键属性是PreviewTextInput

答案 1 :(得分:11)

您看到的红色边框实际上是ValidationTemplate,您可以扩展并为用户添加信息。见这个例子:

    <UserControl.Resources>
        <ControlTemplate x:Key="validationTemplate">
            <Grid>
                <Label Foreground="Red" HorizontalAlignment="Right" VerticalAlignment="Center">Please insert a integer</Label>
                <Border BorderThickness="1" BorderBrush="Red">
                    <AdornedElementPlaceholder />
                </Border>
            </Grid>
        </ControlTemplate>
    </UserControl.Resources>

<TextBox Name="tbValue" Validation.ErrorTemplate="{StaticResource validationTemplate}">

答案 2 :(得分:8)

我们可以对文本框更改事件进行验证。 以下实现可防止除数字和小数点以外的按键输入。

private void textBoxNumeric_TextChanged(object sender, TextChangedEventArgs e)
{
        TextBox textBox = sender as TextBox;
        Int32 selectionStart = textBox.SelectionStart;
        Int32 selectionLength = textBox.SelectionLength;
        String newText = String.Empty;
        int count = 0;
        foreach (Char c in textBox.Text.ToCharArray())
        {
            if (Char.IsDigit(c) || Char.IsControl(c) || (c == '.' && count == 0))
            {
                newText += c;
                if (c == '.')
                    count += 1;
            }
        }
        textBox.Text = newText;
        textBox.SelectionStart = selectionStart <= textBox.Text.Length ? selectionStart : textBox.Text.Length;    
}

答案 3 :(得分:0)

如果你在WPF中工作更好地使用支持所有平台和来自presentationcore.dll的PreviewTextInput事件

这是一个例子:

private void TextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
    {
        if ((e.Text) == null || !(e.Text).All(char.IsDigit))
        {
            e.Handled = true;
        }
    }

答案 4 :(得分:0)

以下是使用正则表达式在WPF中创建数字字段的方法。

XAML:

<TextBox PreviewTextInput="NumberValidationTextBox"></TextBox>

后面的代码:

private void NumberValidationTextBox(object sender, TextCompositionEventArgs e)
{
Regex regex = new Regex("[^0-9]+");
e.Handled = regex.IsMatch(e.Text);
}