2016-07-30 6 views
0

У меня есть текстовое поле в WPF, и я хочу проверить вход пользователя, я нашел много примеров, которые делают биты того, что я хочу, но никто из них не делает все это.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

Я использую этот подход для простоты и гибкости. Просто скромная смесь Реджекса и простой условной логики. Эта же модель может применяться практически к любой форме проверки ввода текста.

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>