Silverlight / xaml - 在数据网格中显示子数据

时间:2009-12-18 16:14:12

标签: silverlight entity-framework xaml wcf-ria-services

我在数据库中有两个表,并使用实体框架和ria服务在简单的数据网格中显示数据。这是数据库/ EF结构

Cars      Make
-----     ----
CarId     MakeId
Car       Make
MakeId 

在我的Silverlight数据网格中,我想显示以下两列,例如

Car      Make
---      -----
Escort   Ford
Megane   Renault
Rav4     Toyota

我可以很容易地绑定到Cars表并显示汽车,但我无法弄清楚如何显示从子表中取得的内容

我用来配置数据网格的xaml如下:

<datagrid:DataGrid x:Name="CarGrid" AutoGenerateColumns="False" MinHeight="100" IsReadOnly="True" ItemsSource="{Binding ElementName=MyData, Path=Data}">
                    <datagrid:DataGrid.Columns>

                        <datagrid:DataGridTextColumn Header="Car" Binding="{Binding Car}"/>
                        <datagrid:DataGridTextColumn Header="Make" Binding="{Binding Cars.Make}"/>
......

datagrid数据源绑定到DomainDataSource方法“GetCars”。我不确定它是否自动加载子表(不确定我是否必须明确告诉它,并且不知道如何在xaml中执行此操作)。

我确信我可以抛弃xaml并在c#中完成它,但我想成为一名优秀的编码器并在xaml中完成。

4 个答案:

答案 0 :(得分:2)

我找到了一个很好的解决方案。我们试试这个:http://jeffhandley.com/archive/2010/03/12/lookupdata.aspx

然后不要忘记在您的域服务类的查询查找中“包含”您的子表。

例如:

public IQueryable<Car> GetCars()
{
    return this.ObjectContext.Cars.Include("Make");
}

用您自己的名称替换名称。

PS:请记住执行博客指示的所有步骤。

答案 1 :(得分:1)

除非您在某处明确指定它(例如使用Linq-to-SQL的DataContext.LoadOptions),否则子记录不会自动加载父记录。

以下是Linq-to-SQL中的完成方式:

List<tblInventory> result;
using (var dc = new SMDataContext())
{
    dc.Log = Console.Out;
    var dlo = new DataLoadOptions();
    dlo.LoadWith<tblInventory>(x => x.tblItemInfo);
    dc.LoadOptions = dlo;
    var q = (from o in dc.tblInventories
             select o).Take(10);
    result = q.ToList();
}

这是结果日志:

SELECT TOP 10 [t0].[fldItemPrivateSN], [t0].[fldCatNo], [t0].[fldSerNo], ...
              ..., [t1].[fldWeight], [t1].[fldValue], ...
FROM [dbo].[tblInventory] AS [t0]
INNER JOIN [dbo].[tblItemInfo] AS [t1] ON [t1].[fldCatNo] = [t0].[fldCatNo]
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.30729.1

更新:此外,您似乎绑定到Cars.Make,尝试绑定到Car.Make

答案 2 :(得分:1)

您需要将Make列的绑定更改为Car.Make,并且您需要确保EF填充此属性。

我建议将调试器附加到服务并检查EF的内容。

您还可以将SQL事件探查器附加到SQL Server实例,并查看正在运行的EF查询。

答案 3 :(得分:0)

迈克希尔伯格的文章解决了你感兴趣的大部分内容:

http://blogs.msdn.com/mikehillberg/archive/2009/03/26/implementing-selectedvalue-with-the-silverlight-combobox.aspx

和Manish Dalal的文章一样:

http://weblogs.asp.net/manishdalal/archive/2008/09/28/combobox-in-datagrid.aspx

即使借助这些示例,我也很难实现与您相同的东西(使用手工制作的MVVM而不是RIA)。

我最终得到了一个不妥协的黑客,它确实破坏了底层对象(你想要避免的东西),这很难。

祝你好运。