2009-09-28 30 views
5

bu bağlama parçası olmadan doğrulama kullanmak mümkündür? Mesele benim metin kutumun herhangi bir nesneye bağlı olmaması, ancak yine de içeriğini doğrulamak istiyorum. Ben şimdiye kadar bulduğum tek yolu şudur: TextBox.Text (bu durumda, Name özelliği olarak) bir şey bağlı olduğundaWPF Doğrulama bağlanmamış metin kutusu

<TextBox Grid.Row="0" Grid.Column="1" MaxLength="50" x:Name="textBoxTubeName" Margin="5,5,0,5"> 
     <TextBox.Text> 
      <Binding Path="Name" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" NotifyOnValidationError="True"> 
       <Binding.ValidationRules> 
        <validation:InvalidCharactersRule /> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 

Ama yine, sadece çalışır, bu konuda nasıl gider bağlayıcı olmadan

Teşekkürler!

cevap

3

According to the MSDN forums henüz mümkün değil ama planlandı (Not: bu eski bir yazıdır). Bununla birlikte, hala bunu yapmanın bir yolunu bulamıyorum, bu yüzden henüz uygulanamayabilir.

+0

Evet, ben kodunu kendim yapmak zorunda olacak düşünüyorum. Ben bağlayıcı konsantre Microsoft fikri iyi olduğunu düşünüyorum, fakat bu amaç için doğrulama bu şekilde sınırlandırılması, o kadar iyi değil. Teşekkürler Lucas. – Carlo

+0

@Carlo: Tamamen kabul etti. – Kredns

+0

Merhaba. Bu konuda herhangi bir güncelleme var mı? Ben de aynısını yapmak isterim. –

2

Bu kod arkadan yapmak zor çok. Temel olarak, koddan geçici bağlayıcı ayarlamak ve doğrulama hatası yükseltmek ve giriş geçerli bir değer olduğunda tekrar geçici bağlama şeyler kaldırabilirsiniz olabilir. Ben (ama yoktan iyidir) kötü uygulama düşünün ne kullanın İşte

:

/// <summary> 
    /// Marks a textBox control as invalid (via validation error) from code. 
    /// </summary> 
    /// <param name="textBox">The text box.</param> 
    /// <param name="errorContent">Content of the error.</param> 
    public static void ValidationMarkInvalid(TextBox textBox, String errorContent) 
    { 
     DependencyProperty textProp = TextBox.TextProperty; 
     if (!BindingOperations.IsDataBound(textBox, textProp)) 
     { 
      if (textBox.DataContext == null) 
      { 
       textBox.DataContext = new EmptyDataContext(); 
      } 

      Binding b = new Binding("CodeBehind"); 
      b.FallbackValue = textBox.Text; 
      b.ValidatesOnExceptions = true; 
      BindingOperations.SetBinding(textBox, textProp, b); 
     } 

     BindingExpression bindingInError = 
      textBox.GetBindingExpression(TextBox.TextProperty); 

     var validationError = new ValidationError(
      new EmptyValidationRule(), 
      bindingInError, 
      errorContent, 
      new Exception(errorContent)); 

     Validation.MarkInvalid(bindingInError, validationError); 
    } 

    /// <summary> 
    /// Clears the validation error from a textBox. 
    /// </summary> 
    /// <param name="textBox">The text box.</param> 
    public static void ValidationClear(TextBox textBox) 
    { 
     DependencyProperty textProp = TextBox.TextProperty; 
     if (BindingOperations.IsDataBound(textBox, textProp)) 
     { 
      String value = textBox.Text; 
      Validation.ClearInvalid(textBox.GetBindingExpression(TextBox.TextProperty)); 
      BindingOperations.ClearBinding(textBox, textProp); 
      textBox.Text = value; 

      EmptyDataContext ctx = textBox.DataContext as EmptyDataContext; 
      if (ctx != null) 
      { 
       textBox.DataContext = null; 
      } 
     } 
    } 

    #region Nested Type: EmptyDataContext 
    private sealed class EmptyDataContext : INotifyPropertyChanged 
    { 
     public Object CodeBehind 
     { 
      get 
      { 
       throw new FormatException(); 
      } 
      set 
      { 
       throw new FormatException(); 
      } 
     } 

     #region INotifyPropertyChanged Members 
     public event PropertyChangedEventHandler PropertyChanged; 
     #endregion 
    } 
    #endregion 

    #region Nested Type: EmptyValidationRule 
    private sealed class EmptyValidationRule : ValidationRule 
    { 
     /// <summary> 
     /// When overridden in a derived class, performs validation checks on a value. 
     /// </summary> 
     /// <param name="value">The value from the binding target to check.</param> 
     /// <param name="cultureInfo">The culture to use in this rule.</param> 
     /// <returns> 
     /// A <see cref="T:System.Windows.Controls.ValidationResult"/> object. 
     /// </returns> 
     public override ValidationResult Validate(Object value, CultureInfo cultureInfo) 
     { 
      return new ValidationResult(false, String.Empty); 
     } 
    } 
    #endregion 

Şimdi, kod arkasında sizin dan bunu:

ValidationMarkInvalid(textBox, "Please enter something valid!"); 

ve

ValidationClear(textBox); 

PS: doğrulama temizlemek Eğer istisnalar yapabilirsiniz üzerinde doğrulamak istemiyorsanız EmptyDataContext sınıfını yukarıdaki yöntemlerden kaldırın.