我想验证用户输入以确保它们是整数。我该怎么做?我想过使用IDataErrorInfo
这似乎是在WPF中进行验证的“正确”方法。所以我尝试在我的ViewModel中实现它。
但问题是我的文本框绑定了一个整数字段,并且没有必要验证int
是否为int
。我注意到WPF会自动在文本框周围添加红色边框,以通知用户错误。基础属性不会更改为无效值。但我想通知用户这个。我该怎么办?
答案 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);
}