Kontrolki wizualne w technologii Windows Forms pozwalają tworzyć powiązanie pomiędzy właściwością kontrolki a właściwością obiektu będącego źródłem danych dla tej kontrolki.
class MyTextBox : TextBox
{
public void Bind(object obj, string dataMember)
{
DataBindings.Add(new Binding("Text", obj, dataMember));
}
}
Takie rozwiązanie działa bez zarzutu jednak ma pewną wadę – nazwa właściwości źródła danych przekazywana jest jako łańcuch znaków. Powoduje to sytuację, w której poprawność tego powiązania zweryfikujemy dopiero po uruchomieniu programu chociaż chciałoby się aby było to już na etapie kompilacji.
Aby osiągnąć mój cel postanowiłem skorzystać z możliwości jakie oferują wyrażenia lambda w ramach języka C#.
class MyTextBox1 : TextBox
{
public void Bind<T>(T obj, Expression<Func<T, object>> dataMemberExpr)
{
string dataMember = GetDataMember(dataMemberExpr);
DataBindings.Add(new Binding("Text", obj, dataMember));
}
private string GetDataMember(Expression<Func<T, object>> dataMemberExpr)
{
LambdaExpression expr = dataMemberExpr;
Expression node = expr.Body;
MemberExpression memberExpr = (MemberExpression)node;
return memberExpr.Member.Name;
}
}
Aby stworzyć powiązanie należy wywołać metodę Bind
w następujący sposób:
class Person
{
public string Name { get; set; }
}
Person p = new Person { Name = "Bob" };
MyTextBox1 myTextBox1 = new MyTextBox1();
myTextBox1.Bind(p, x => x.Name);