I am looking into strong typed Windows Forms databinding using extension methods. I have got this far following help from Xavier as below:
using System; using System.Linq.Expressions; using System.Windows.Forms; namespace WindowsFormsApplication1 { public static Binding Add<T> (this ControlBindingsCollection dataBindings, object dataSource, Expression<Func<Control, object>> controlExpression, Expression<Func<T, object>> objectExpression) { return Add(dataBindings, dataSource, controlExpression, objectExpression, false); } public static Binding Add<T> (this ControlBindingsCollection dataBindings, object dataSource, Expression<Func<Control, object>> controlExpression, Expression<Func<T, object>> objectExpression, bool formattingEnabled) { string controlPropertyName = ProcessExpression(controlExpression.Body); string bindingTargetName = ProcessExpression(objectExpression.Body); return dataBindings .Add(controlPropertyName, dataSource, bindingTargetName, formattingEnabled); } public static Binding Add<T, K> (this ControlBindingsCollection dataBindings, object dataSource, Expression<Func<K, object>> controlExpression, Expression<Func<T, object>> objectExpression) { return Add(dataBindings, dataSource, controlExpression, objectExpression, false); } public static Binding Add<T, K> (this ControlBindingsCollection dataBindings, object dataSource, Expression<Func<K, object>> controlExpression, Expression<Func<T, object>> objectExpression, bool formattingEnabled ) { string controlPropertyName = ProcessExpression(controlExpression.Body); string bindingTargetName = ProcessExpression(objectExpression.Body); return dataBindings.Add(controlPropertyName, dataSource, bindingTargetName, formattingEnabled); } private static string ProcessExpression(Expression expression) { string propertyName; if (expression is MemberExpression) { propertyName = ((MemberExpression) (expression)).Member.Name; } else if (expression is UnaryExpression) { propertyName = ((MemberExpression) ((UnaryExpression) (expression)).Operand).Member.Name; } else { throw new InvalidOperationException( "Unknown expression type error in DataBindingsExtensionMethods.Add<T, K>"); } return propertyName; } } Now I can set up a DataBinding like this:
txtBoundInt.DataBindings.Add<Contact> (bindingSource, tb => tb.Text, contact => contact.Id); Or this:
cboBoundSelectedItem.DataBindings.Add <Contact, ComboBox> (bindingSource, cbo => cbo.SelectedItem, con => con.ContactType) There seems to be a lot of casting of expressions going on though. Is there a better way?
Edit: I did find a better way - it's reproduced below by @Carl_G.