您不能为数据绑定使用隐式类型变量。
让我们假设你的 object ,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
您的属性设置DataGrid
为{Binding MyConcreteClass}
.
最重要的几点是:
- 您只能绑定到一个属性。您不能将数据绑定到字段或方法。
- 您不能绑定到隐式类型。
如果需要,不要忘记实现您的视图模型INotifyPropertyChanged
,并在需要时使用ObservableCollection
s 。