将控件绑定到嵌套属性

问题描述:

基本问题,我已经详尽地搜索了整整一天。将控件绑定到嵌套属性

我的账户对象有一个KeyType对象,它有一个Name属性,全部由Linq生成到SQL。

我的BindingSource:

var result = from account in Schema.Accounts select account as Account; 
Data = new ComplexBindingList<Account>(result.ToList<Account>()); 
DataSource = Data; 
ResetBindings(true); 

我从布拉德利·史密斯在博客借来ComplexBindingList有这个接口:

public class ComplexBindingList<T> : List<T>, ITypedList 

这个工作对我的DataGridView:

Columns.Add(CreateColumn("KeyType.Name", "Key Type"); 

数据的细,因为此代码仅在例外之前起作用:

var v = account.KeyType.Name; 

这不适用于我的文本框。我得到一个异常“属性访问器‘名称’的对象‘EPM.BODA.KeyType’发生以下异常:‘对象不匹配目标类型。’”

// Controller is my BindingSource 
Binding binding = EditField.DataBindings.Add("Text", Controller, "KeyType.Name"); 

我有一个普遍的感觉是反射ISN”工作正常,但似乎无法找到如何填补空白的细节。欢呼任何帮助。

+0

你在哪里初始化帐户?你的意思是result.KeyType.Name? – 2012-04-21 06:17:51

这是我迄今为止,作为一个简单的解决方法。

public virtual Binding GetBinding(string fieldName) 
{ 
    string[] pieces = fieldName.Split('.'); 
    if (pieces.GetLength(0) == 1) 
    { 
     return new Binding("Text", this, fieldName); 
    } 
    else 
    { 
     return new Binding("Text", 
      Current.GetType().GetProperty(pieces[0]).GetValue(Current, null), pieces[1]); 
    } 
} 

// Calling the helper function and adding the binding 
EditField.DataBindings.Add(Controller.GetBinding(mapping.FieldName));