我在WPF中有一个文本字段,我想验证用户输入,我发现了许多例子,它们可以完成我想要的一些但不能完成所有操作。
必须只允许数字(0-9) 只有一个小数位 不允许使用多个'。大多数解决方案似乎允许, 必须输入最小数量 最高999.9
到目前为止我发现的最佳解决方案是使用正则表达式
new Regex(@"[^0-9.]+")
但这显然不会限制小数位数或小数点数。也没有最小或最大
只能指出一个正确的方向吗?
由于
答案 0 :(得分:0)
更干净的解决方案可能是将文本框绑定到double
(或decimal
)值,该值将为您提供自动数字和小数点规则并添加[Range]
属性您的最小值和最大值:
[Range(0, 999.9), "Error message"]
public double myValue { get; set; }
或者,如果您想要首先实际阻止输入无效输入,请为文本框实现OnKeyDown
事件处理程序,并尝试将输入转换为数字。如果它失败拒绝输入或如果它成功但数字超出你的范围拒绝输入。这不是一个理想的解决方案。
答案 1 :(得分:0)
我通常使用这种方法,因为它的简单性和灵活性。只是一个简洁的正则表达式和普通的条件逻辑。这种模式几乎可以应用于任何形式的文本输入验证。
ViewModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Text.RegularExpressions;
namespace WpfApplication7
{
public class ViewModel : INotifyPropertyChanged
{
Regex _inputRegex;
public ViewModel()
{
_inputRegex = new Regex(@"^([0-9])+(([.])?([0-9])+)?$");
}
private string _input = "0";
public string Input
{
get
{
return _input;
}
set
{
_input = value;
RaisePropertyChanged("Input");
RaisePropertyChanged("InputValid");
}
}
public bool InputValid {
get
{
if(_inputRegex.IsMatch(_input))
{
//If regex pattern is satisfied, this value is safe
double value = Convert.ToDouble(_input);
//so just apply conditional logic here
return value >= 0 && value <= 999.9;
}
else
{
return false;
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
}
视图
<Window x:Class="WpfApplication7.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication7"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:ViewModel />
</Window.DataContext>
<Window.Resources>
<Style TargetType="FrameworkElement" >
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<Style TargetType="TextBox">
<Setter Property="Width" Value="100" />
<Setter Property="Height" Value="24" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Margin" Value="10" />
</Style>
<Style TargetType="TextBlock" x:Key="default_textblock">
<Setter Property="Height" Value="18" />
<Setter Property="Margin" Value="10" />
</Style>
<Style TargetType="TextBlock" x:Key="error_textblock" BasedOn="{StaticResource default_textblock}">
<Setter Property="Foreground" Value="Red" />
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="60" />
<RowDefinition Height="60" />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Grid.Row="0">
<TextBlock Text="Enter input: " Style="{StaticResource default_textblock}" />
<TextBox Text="{Binding Input, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
<TextBlock Grid.Row="1" Text="Input not valid. Please enter a number between 0 and 999.9" >
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource error_textblock}">
<Setter Property="Visibility" Value="Hidden" />
<Style.Triggers>
<DataTrigger Binding="{Binding InputValid}" Value="False">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</Window>