Обычная привязка данных обычно не допускает выражения. В рамках сетки данных используется отражение (а не исполняемый код, как DataBinder.Eval на странице ASP.NET), чтобы найти свойство, которое вы указываете для привязки к столбцу. Чтобы сделать то, что вы хотите, необходимо оценить привязку как выражение, выяснить, что вы искали родительское -> дочернее отношение, а затем отразиться на этом уровне. AFAIK, встроенная привязка данных на сетке слишком тупа, чтобы знать, как это сделать.
Недавно у меня была такая же проблема, и я решил сделать проекцию LINQ и вместо этого связать ее с сеткой. Что-то вроде следующего (в C #, потому что меня не устраивает синтаксис LINQ в VB):
IList<ClassA> listOfClassAObjects = GetMyListOfClassAObjectsFromSomewhere();
var projection = from ClassA a in listOfClassAObjects
select new { SomeProperty = a.SomeProperty,
SomeOtherProperty = a.SomeOtherProperty,
SomePropertyFromB = a.ClassB.SomeProperty };
datagrid.DataSource = projection;
datagrid.DataBind();
Вы получите список анонимных типов, содержащих эту проекцию, и можете связать соответствующий столбец с SomePropertyFromB
.
Для дополнительной инкапсуляции (если вы делаете это много) поместите проекцию в метод расширения, чтобы вы могли сделать что-то вроде
var data = GetMyListOfClassAObjectsFromSomewhere().ProjectionForDataGrid();
datagrid.DataSource = data;
datagrid.DataBind();