using System; using System.Text.RegularExpressions; using System.Windows.Forms; namespace PlayingWithWinForms { public partial class PhoneNumberView : Form { public PhoneNumberView( ) { InitializeComponent( ); _phoneNumber = new BindableTextBox< IPhoneNumber >( uxPhoneNumberTextBox, CreateTypeFactory.PhoneNumber ); } private IBindableTextBox< IPhoneNumber > _phoneNumber; } public interface IPhoneNumber { string Number { get; } } public class PhoneNumber : IPhoneNumber { public PhoneNumber( string number ) { const string expression = @"[\(\)\-\ ]"; _number = ( null != number ) ? Regex.Replace( number, expression, String.Empty ) : string.Empty; } public string Number { get { return _number; } } public override string ToString( ) { return _number; } private readonly string _number; } public class BindableTextBox< T > : IBindableTextBox< T > { public BindableTextBox( TextBox control, CreateType< T > method ) { _control = control; _method = method; _control.Leave += delegate { BindTo( _method.Invoke( _control ) ); }; } public T Value { get { return _value; } } public void BindTo( T item ) { _value = item; _control.Text = _value.ToString( ); } private readonly TextBox _control; private readonly CreateType< T > _method; private T _value; } internal interface IBindableTextBox< T > { void BindTo( T item ); T Value { get; } } public delegate T CreateType< T >( Control usingControl ); public class CreateTypeFactory { public static CreateType< IPhoneNumber > PhoneNumber = delegate( Control control ) { return new PhoneNumber( control.Text ); }; } }