Estoy buscando en fuertes mecanografiados Windows Forms databinding utilizando métodos de extensión. He llegado hasta aquí después de la ayuda de Xavier de la siguiente manera:Fuerte tipo de Windows Forms databinding
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;
}
}
Ahora puedo establecer una DataBinding así:
txtBoundInt.DataBindings.Add<Contact>
(bindingSource, tb => tb.Text, contact => contact.Id);
O esto:
cboBoundSelectedItem.DataBindings.Add
<Contact, ComboBox>
(bindingSource, cbo => cbo.SelectedItem, con => con.ContactType)
No parece haber una gran cantidad de expresiones va pasando sin embargo. ¿Hay una mejor manera?
Editar: Lo que encontrar una mejor manera, pero tengo problemas para cambiar esta pregunta a la respuesta - es reproduced below por @Carl_G.
Por favor, no modifique su pregunta en una respuesta. Si ha encontrado una solución, debe ir en la sección de respuestas. Para una persona que intenta navegar rápidamente por los enlaces de google para encontrar una solución, es muy desconcertante leer "Muy bien, encontré una solución" sin siquiera saber cuál era su pregunta, o poder evaluar si es aplicable al problema del visitante. –
Oh, bueno, tengo que seguir las reglas ... – stuartd
Cabe señalar que el nuevo nombre de la función() en C# 6 también podría utilizarse para evitar el uso de una cadena. https://msdn.microsoft.com/en-us/library/dn986596.aspx –