2016-07-30 30 views
0

Ich habe ein Textfeld in WPF und ich möchte die Benutzereingabe validieren, ich habe viele Beispiele gefunden, die Teile von dem tun, was ich will, aber keine, die alles tun.WPF Textfield Validation

Es muss nur numerische Nummern (0-9) zulassen Nur eine Dezimalstelle Nicht zulässig mehrere '.' die meisten Lösungen zu ermöglichen scheinen, Mindestanzahl Eintrag Maximum 999,9

beste Lösung, die ich bisher gefunden einen regulären Ausdruck verwendet

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

aber dies offensichtlich nicht begrenzen Anzahl der Dezimalstellen oder Zahl sein muss von Dezimalpunkten. Auch kein min oder max

Kann mir nur einer in die richtige Richtung zeigen?

Dank

Antwort

0

Eine sauberere Lösung könnte das Textfeld zu einem double (oder decimal) Wert zu binden sein, die Ihnen die automatischen Ziffer und Komma-Regeln geben und ein [Range] Attribut Ihrer Minimal- und Maximalwerte hinzu:

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

Oder, wenn Sie tatsächlich ungültige Eingabe verhindern möchten, dass an erster Stelle eingegeben werden, implementieren die OnKeyDown Ereignishandler für das Textfeld ein und versuchen, die Eingabe in eine Zahl zu konvertieren. Wenn es fehlschlägt, die Eingabe abzulehnen oder wenn es erfolgreich ist, aber die Nummer außerhalb Ihres Bereichs liegt, lehnen Sie die Eingabe ab. Dies ist keine ideale Lösung.

0

Ich verwende diesen Ansatz für seine Einfachheit und Flexibilität. Nur eine bescheidene Mischung aus Regex und einfach-alter bedingter Logik. Dasselbe Muster kann für fast jede Form der Validierung von Texteingaben angewendet werden.

Das Ansichtsmodell

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)); 
     } 
    } 
} 

The View

<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>