我有以下查询:
var qry = from itemA in db.TableA
join itemB in db.TableB on itemA.ID equals itemB.ID
join itemC in db.ItemC on itemA.ID equals itemC.ID
select new { itemC, itemA, itemB};
如果我现在将查询绑定到Datagrid,如下所示:
dgTest.ItemsSource = qry;
并像这样配置Datagrid的TextColumn:
<DataGrid x:Name="dgTest" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Test" Binding="{Binding TableA.Name}"/>
</DataGrid.Columns>
</DataGrid>
列是空的...
谁能告诉我我做错了什么?
提前致谢!
答案 0 :(得分:2)
您不能将隐式类型变量用于数据绑定。
假设您的对象TableA
,TableB
和TableC
如下所示:
public class TableA
{
public int ID { get; set; }
public string Name { get; set; }
}
public class TableB
{
public int ID { get; set; }
}
public class TableC
{
public int ID { get; set; }
}
现在您需要创建一个具体的类,而不是像在select new {
语句中那样使用隐式类型。
例如:
public class MyConcreteClass
{
public TableA TableA { get; set; }
public TableB TableB { get; set; }
public TableC TableC { get; set; }
}
最后,您拥有LINQ查询的类应该如下所示:
public class MyDataSource : INotifyPropertyChanged
{
private Database db;
public MyDataSource()
{
db = new Database()
{
TableA = new List<TableA>
{
new TableA { ID = 1, Name = "Hello world!" }
},
TableB = new List<TableB>
{
new TableB { ID = 1 }
},
TableC = new List<TableC>
{
new TableC { ID = 1 },
new TableC { ID = 2 }
}
};
}
public event PropertyChangedEventHandler PropertyChanged;
public IEnumerable<MyConcreteClass> MyConcreteClass
{
get { return this.MyQuery(); }
}
private IEnumerable<MyConcreteClass> MyQuery()
{
var qry = from itemA in db.TableA
join itemB in db.TableB on itemA.ID equals itemB.ID
join itemC in db.TableC on itemA.ID equals itemC.ID
select new MyConcreteClass
{
TableA = itemA,
TableB = itemB,
TableC = itemC
};
return qry.AsEnumerable();
}
}
Database
类看起来像这样:
public class Database
{
public IEnumerable<TableA> TableA { get; set; }
public IEnumerable<TableB> TableB { get; set; }
public IEnumerable<TableC> TableC { get; set; }
}
并将ItemsSource
的{{1}}属性设置为DataGrid
。
最重要的一点是:
如果需要,请不要忘记使用您的视图模型工具{Binding MyConcreteClass}
,并在需要的地方使用INotifyPropertyChanged
。