Я изучаю строго типизированную привязку данных Windows Forms с использованием методов расширения. Я получил эту далеко следующую помощь от Ксавье , как показано ниже:
using System;
using System.Linq.Expressions;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public static Binding Add
(this ControlBindingsCollection dataBindings,
object dataSource,
Expression> controlExpression,
Expression> objectExpression)
{
return Add(dataBindings, dataSource, controlExpression, objectExpression, false);
}
public static Binding Add
(this ControlBindingsCollection dataBindings,
object dataSource,
Expression> controlExpression,
Expression> objectExpression,
bool formattingEnabled)
{
string controlPropertyName = ProcessExpression(controlExpression.Body);
string bindingTargetName = ProcessExpression(objectExpression.Body);
return dataBindings
.Add(controlPropertyName, dataSource, bindingTargetName, formattingEnabled);
}
public static Binding Add
(this ControlBindingsCollection dataBindings,
object dataSource,
Expression> controlExpression,
Expression> objectExpression)
{
return Add(dataBindings, dataSource, controlExpression, objectExpression, false);
}
public static Binding Add
(this ControlBindingsCollection dataBindings,
object dataSource,
Expression> controlExpression,
Expression> 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");
}
return propertyName;
}
}
Теперь я могу настроить привязку данных следующим образом:
txtBoundInt.DataBindings.Add
(bindingSource, tb => tb.Text, contact => contact.Id);
Или вот это:
cboBoundSelectedItem.DataBindings.Add
(bindingSource, cbo => cbo.SelectedItem, con => con.ContactType)
Кажется, что происходит много приведений выражений. продолжается, хотя. Есть ли лучший способ?
Редактировать: Я нашел лучший способ, но у меня возникли проблемы с заменой этого вопроса на этот ответ - он воспроизведен ниже @Carl_G.
Как насчет установки типа возвращаемого значения для объекта?
public static Binding Add<T>
(this ControlBindingsCollection dataBindings, object dataSource,
Expression<Func<Control, object>> controlLambda,
Expression<Func<T, object>> objectLambda) {
string controlPropertyName =
((MemberExpression)(controlLambda.Body)).Member.Name;
string bindingTargetName =
((MemberExpression)(objectLambda.Body)).Member.Name;
return dataBindings.Add
(controlPropertyName, dataSource, bindingTargetName);
}