Last week, I posted an example of using a Regular Expression to control the input of numbers into a TextBox. A couple of my fellow disciples commented that they’d just use a Regular Expression Behavior or DP to control the input of the text. Now, there are a couple of reasons that I’d use the dedicated NumericTextBoxBehavior
.
The first reason is that it’s a simple control for those that aren’t comfortable writing Regular Expressions. After all, why should you write a complex Regular Expression when I can write one for you?
The second reason is that the numeric control is internationalized from the get-go. I’ve already taken care of sorting out the whole internationalised decimal place issue, so you don’t have to worry about it with your Regular Expression.
Saying that, the Regular Expression behavior is a cracking idea, and one I could kick myself for not thinking of earlier. So, in order to add Regular Expression functionality in your TextBox
, all you need do is add the following code:
namespace Goldlight.Base.Behaviors
{
using System.Linq;
using System.Windows.Controls;
using System.Windows.Interactivity;
using System.Windows;
using System.Windows.Input;
using System.Text.RegularExpressions;
public class RegularExpressionTextBoxBehavior : Behavior<TextBox>
{
public string Mask { get; set; }
#region Overrides
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PreviewTextInput += AssociatedObject_PreviewTextInput;
#if !SILVERLIGHT
DataObject.AddPastingHandler(AssociatedObject, OnClipboardPaste);
#endif
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.PreviewTextInput -= AssociatedObject_PreviewTextInput;
#if !SILVERLIGHT
DataObject.RemovePastingHandler(AssociatedObject, OnClipboardPaste);
#endif
}
#endregion
#if !SILVERLIGHT
private void OnClipboardPaste(object sender, DataObjectPastingEventArgs dopea)
{
string text = dopea.SourceDataObject.GetData(dopea.FormatToApply).ToString();
if (!string.IsNullOrWhiteSpace(text) && !Validate(text))
dopea.CancelCommand();
}
#endif
void AssociatedObject_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
e.Handled = !Validate(e.Text);
}
protected bool Validate(string value)
{
TextBox textBox = AssociatedObject;
string pre = string.Empty;
string post = string.Empty;
if (!string.IsNullOrWhiteSpace(textBox.Text))
{
pre = textBox.Text.Substring(0, textBox.SelectionStart);
post = textBox.Text.Substring(textBox.SelectionStart + textBox.SelectionLength,
textBox.Text.Length - (textBox.SelectionStart + textBox.SelectionLength));
}
else
{
pre = textBox.Text.Substring(0, textBox.CaretIndex);
post = textBox.Text.Substring(textBox.CaretIndex,
textBox.Text.Length - textBox.CaretIndex);
}
string test = string.Concat(pre, value, post);
string pattern = Mask;
if (string.IsNullOrWhiteSpace(pattern))
return true;
return new Regex(pattern).IsMatch(test);
}
}
}
As you can see, it’s similar in code to the other behaviour. The only real difference in it is that it has a mask string
which is used to add the Regular Expression text.
A developer for over 30 years, I've been lucky enough to write articles and applications for Code Project as well as the Intel Ultimate Coder - Going Perceptual challenge. I live in the North East of England with 2 wonderful daughters and a wonderful wife.
I am not the Stig, but I do wish I had Lotus Tuned Suspension.