我在WPF中有一個textfield,我想驗證用戶輸入,我發現很多的例子,做我想要的東西,但沒有做這一切。WPF Textfield Validation
它只允許數字(0-9) 只有一個小數位 不允許多個'。'其中大部分的解決方案似乎允許, 最小號碼輸入必須是 最大999.9
最好的解決方案,我發現到目前爲止是使用正則表達式
new Regex(@"[^0-9.]+")
但這顯然不限制小數或數數的小數點。也沒有最小或最大
只能有一個人指出我在正確的方向嗎?
感謝
我在WPF中有一個textfield,我想驗證用戶輸入,我發現很多的例子,做我想要的東西,但沒有做這一切。WPF Textfield Validation
它只允許數字(0-9) 只有一個小數位 不允許多個'。'其中大部分的解決方案似乎允許, 最小號碼輸入必須是 最大999.9
最好的解決方案,我發現到目前爲止是使用正則表達式
new Regex(@"[^0-9.]+")
但這顯然不限制小數或數數的小數點。也沒有最小或最大
只能有一個人指出我在正確的方向嗎?
感謝
一個清潔的解決方案可能是將文本框綁定到一個double
(或decimal
)值,它會給你自動數字和小數點的規則,並添加您的最小值和最大值的[Range]
屬性:
[Range(0, 999.9), "Error message"]
public double myValue { get; set; }
或者,如果要真正地阻止無效的輸入在第一時間被輸入,實現對文本框中OnKeyDown
事件處理程序,並嘗試將輸入轉換爲數字。如果它拒絕輸入,或者如果成功但數字超出範圍,則拒絕輸入。這不是一個理想的解決方案。
我通常使用這種方法,因爲它的簡單性和靈活性。只是正則表達式和普通條件邏輯的簡單混合。這種相同的模式可以應用於幾乎任何形式的文本輸入驗證。
視圖模型
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>