2016-04-01 9 views
0

Das Standardverhalten in TextBoxen, wenn eine Eingabezeichenfolge nicht gültig ist, besteht darin, ein rotes Quadrat anzuzeigen (z. B. führt der Benutzer einen Buchstaben in numerische TextBox ein). Dies geschieht, wenn TextBox den Fokus verliert.Abbrechen der TextBox-Eingabe bei Validierungsfehlern

Ich möchte dieses Verhalten implementieren:

  • der Textbox den Fokus verliert.
  • TextBox interne Validierung (Datum, numerische, etc).
  • Wenn die eingegebene Benutzerzeichenfolge nicht gültig ist, wird der alte Wert wiederhergestellt und TextBox zeigt keinen Fehler an.

Antwort

0

Sie haben eine exemple der Validierung in Textbox hier in diesem Link: http://www.codeproject.com/Tips/690130/Simple-Validation-in-WPF

<ControlTemplate x:Key="validationErrorTemplate"> 
    <DockPanel> 
     <TextBlock Foreground="Red" 
      DockPanel.Dock="Top">!</TextBlock> 
     <AdornedElementPlaceholder 
      x:Name="ErrorAdorner" 
     ></AdornedElementPlaceholder> 
    </DockPanel> 
</ControlTemplate> 




public class NameValidator : ValidationRule 
    { 
     public override ValidationResult Validate 
      (object value, System.Globalization.CultureInfo cultureInfo) 
     { 
      if (value == null) 
       return new ValidationResult(false, "value cannot be empty."); 
      else 
      { 
       if (value.ToString().Length > 3) 
        return new ValidationResult 
        (false, "Name cannot be more than 3 characters long."); 
      } 
      return ValidationResult.ValidResult; 
     } 
    } 


<TextBox Height="23" HorizontalAlignment="Left" 
       Grid.Column="1" Grid.Row="0" Name="textBox1" 
       VerticalAlignment="Top" Width="120" 
       Validation.ErrorTemplate="{StaticResource validationErrorTemplate}" 
     > 
    <TextBox.Text> 
     <Binding Path="Name" Mode="TwoWay" 
     UpdateSourceTrigger="LostFocus"> 
      <Binding.ValidationRules> 
       <local:NameValidator></local:NameValidator> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 
0

auf den alten Wert zurückkehrend ist ganz einfach, wenn Sie MVVM verwenden. In Ihrem ViewModel-Propeller können Sie den neuen Wert einfach nicht auf das Modell setzen, wenn dieser ungültig ist, und stattdessen PropertyChanged aufrufen. Dies teilt dem gebundenen Ansichtselement mit, dass es den Eigenschaften-Getter aufruft, der den alten Wert zurückgibt und den Inhalt des Ansichtselementes auf den alten Wert zurücksetzt.

Beispiel (Validierung, dass eine Benutzereingabe ist ein int Wert):

public string Number 
{ 
    get { return _model.Number.ToString(); } 
    set 
    { 
     if (_model.Number.ToString() != value) 
     { 
      int number; 
      if (int.TryParse(value, out number)) 
      { 
       _model.Number = number; 
      } 

      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Number)); 
     } 
    } 
} 
+0

Das ist für Validierungen in Ansichtsmodell gut funktioniert. Das Problem besteht hier, wenn der Benutzer eine ungültige Datumszeichenfolge eingibt und die Eigenschaft in ViewModel DateTime ist. TextBox führt die interne Validierung selbst durch und zeigt den Fehler an; textbox führt die Bindung an viewmodel nicht durch, da die Zeichenfolge nicht in DateTime konvertiert werden kann und die falsche Datumszeichenfolge darin verbleibt. – Poeta

Verwandte Themen