/// <summary> /// Creates or modifies the RegexValidationRule in the TextBox's /// Text property binding to use the current values of the attached /// properties exposed by this class. /// </summary> /// <param name="textBox">The TextBox being validated.</param> static void VerifyRegexValidationRule(TextBox textBox) { RegexValidationRule regexRule = GetRegexValidationRuleForTextBox(textBox); if (regexRule != null) { regexRule.RegexText = textBox.GetValue(RegexValidator.RegexTextProperty) as string; regexRule.ErrorMessage = textBox.GetValue(RegexValidator.ErrorMessageProperty) as string; } }
/// <summary> /// Returns a RegexValidationRule to be used for validating the specified TextBox. /// If the TextBox is not yet initialized, this method returns null. /// </summary> static RegexValidationRule GetRegexValidationRuleForTextBox(TextBox textBox) { if (!textBox.IsInitialized) { // If the TextBox.Text property is bound, but the TextBox is not yet // initialized, the property's binding can be null. In that situation, // hook its Initialized event and verify the validation rule again when // that event fires. At that point in time, the Text property's binding // will be non-null. EventHandler callback = null; callback = delegate { textBox.Initialized -= callback; VerifyRegexValidationRule(textBox); }; textBox.Initialized += callback; return(null); } // Get the binding expression associated with the TextBox's Text property. BindingExpression expression = textBox.GetBindingExpression(TextBox.TextProperty); if (expression == null) { throw new InvalidOperationException( "The TextBox's Text property must be bound for the RegexValidator to validate it."); } // Get the binding which owns the binding expression. Binding binding = expression.ParentBinding; if (binding == null) { throw new ApplicationException( "Unexpected situation: the TextBox.Text binding expression has no parent binding."); } // Look for an existing instance of the RegexValidationRule class in the // binding. If there is more than one instance in the ValidationRules // then throw an exception because we don't know which one to modify. RegexValidationRule regexRule = null; foreach (ValidationRule rule in binding.ValidationRules) { if (rule is RegexValidationRule) { if (regexRule == null) { regexRule = rule as RegexValidationRule; } else { throw new InvalidOperationException( "There should not be more than one RegexValidationRule in a Binding's ValidationRules."); } } } // If the TextBox.Text property's binding does not yet have an // instance of RegexValidationRule in its ValidationRules, // add an instance now and return it. if (regexRule == null) { regexRule = new RegexValidationRule(); regexRule.ValidationFailed += OnValidationFailed; regexRule.FailureCleared += OnFailureCleared; binding.ValidationRules.Add(regexRule); } return(regexRule); }