2016-04-01 17 views
0

Bir giriş dizesi geçerli olmadığında TextBox'lardaki standart davranış, kırmızı bir karenin gösterilmesidir (örneğin, kullanıcı sayısal TextBox'a bir harf ekler). TextBox odağı kaybettiğinde bu olur.Doğrulama hatalarında TextBox girdisini iptal etme

  • TextBox odağı kaybettiğinde:

    Ben bu davranışı uygulamak istiyoruz.

  • TextBox dahili doğrulama yapar (tarih, sayısal vb.).
  • Girilen kullanıcı dizesi geçerli değilse, eski değer geri yüklenir ve TextBox herhangi bir hata göstermez.

cevap

0

bu linkte burada metin kutusuna doğrulama bir EXEMPLE var: Eğer MVVM kullanıyorsanız 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

eski değerine geri dönülüyor oldukça kolaydır. ViewModel'in prop ayarlayıcısında, geçersizse yeni değeri modele ayarlamaz ve bunun yerine PropertyChanged'u çağırırsınız. Bu, bağlı görüntü öğesinin, eski değeri döndürecek ve böylece görünüm öğesinin içeriğini eski değere geri döndürecek olan özellik bulucunuzu çağırmasını söyleyecektir.

Örnek (kullanıcı girişi, bir int değerdir doğrulama) ViewModel doğrulaması için çalışıyor

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

. Buradaki sorun, kullanıcının geçersiz bir tarih dizesi tanıttığı ve ViewModel'deki özelliğin DateTime olduğu durumdur. TextBox iç doğrulamayı kendisi yapar ve hatayı gösterir; textbox dize DateTime dönüştüremediğinden ve yanlış tarih dizesi içinde kalmayacağından, viewmodel'in bağlayıcısını yapmaz. – Poeta

İlgili konular