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.
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
@Carlo: Tamamen kabul etti. – Kredns
Merhaba. Bu konuda herhangi bir güncelleme var mı? Ben de aynısını yapmak isterim. –