在Silverlight中数据绑定到LINQ查询结果

时间:2011-03-13 06:02:02

标签: c# silverlight linq data-binding

我正在检索简单的LINQ查询,但我正在使用ListBox加入两个表和绑定数据。 我无法将项目正确显示到ListBox中。

一旦我删除新项目并选择只使用它的关键字将正常工作,但我想加入两个表,选择新的关键字,它不允许与ListBox绑定数据。 我的代码就像。 这不允许与ListBox绑定。

var newPeople = (from p in clsGeneral.db.Table<SmartFXAttribes>()
                 join q in clsGeneral.db.Table<CategoryAttribes>() on p.catId equals q.ID
                 where p.catId == ((SmartFX.CategoryAttribes)((ComboBox)cmbPrintSize).SelectedValue).ID
                 select new 
                 {
                     p.ID,
                     p.ImageHeight,
                     p.Imageoutline,
                     p.ImageUnit,
                     p.ImageWidth,
                     p.NoofPic,
                     p.TextboxCaption,
                     p.CanvasPixelHeight,
                     p.CanvasPixelWidth,
                     p.CanvasUnit,
                     p.catId,
                     q.FileName
                 }).ToList();
lstThumbnail.ItemsSource = newPeople;

此代码可以正常使用。

var newPeople =
    (from p in clsGeneral.db.Table<SmartFXAttribes>()
     join q in clsGeneral.db.Table<CategoryAttribes>() on p.catId equals q.ID
     where p.catId == ((SmartFX.CategoryAttribes)((ComboBox)cmbPrintSize).SelectedValue).ID
     select p).ToList();

lstThumbnail.ItemsSource = newPeople;

谢谢!

1 个答案:

答案 0 :(得分:1)

问题是第一个查询创建了一个匿名类型的对象,但Silverlight无法对匿名类型的对象进行数据绑定(匿名类型是内部的,Silverlight的反射功能不允许从其他程序集访问内部类型)。你的第二个查询返回一个命名类型的对象,所以它可以正常工作。

对此最好的解决方案是声明一个公共类型,其中包含要从第一个查询返回的所有内容的公共属性,并返回该实例。

您可以使用this hack处理它。