2016-07-30 69 views
0

我在WPF中有一個textfield,我想驗證用戶輸入,我發現很多的例子,做我想要的東西,但沒有做這一切。WPF Textfield Validation

它只允許數字(0-9) 只有一個小數位 不允許多個'。'其中大部分的解決方案似乎允許, 最小號碼輸入必須是 最大999.9

最好的解決方案,我發現到目前爲止是使用正則表達式

new Regex(@"[^0-9.]+") 

但這顯然不限制小數或數數的小數點。也沒有最小或最大

只能有一個人指出我在正確的方向嗎?

感謝

回答

0

一個清潔的解決方案可能是將文本框綁定到一個double(或decimal)值,它會給你自動數字和小數點的規則,並添加您的最小值和最大值的[Range]屬性:

[Range(0, 999.9), "Error message"] 
public double myValue { get; set; } 

或者,如果要真正地阻止無效的輸入在第一時間被輸入,實現對文本框中OnKeyDown事件處理程序,並嘗試將輸入轉換爲數字。如果它拒絕輸入,或者如果成功但數字超出範圍,則拒絕輸入。這不是一個理想的解決方案。

0

我通常使用這種方法,因爲它的簡單性和靈活性。只是正則表達式和普通條件邏輯的簡單混合。這種相同的模式可以應用於幾乎任何形式的文本輸入驗證。

視圖模型

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>