【问题标题】:Silverlight/xaml - displaying child data in a datagridSilverlight/xaml - 在数据网格中显示子数据
【发布时间】:2009-12-18 16:14:12
【问题描述】:

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

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

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

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

我可以轻松绑定到 Cars 表并显示汽车,但我不知道如何显示从子表中获取的 Make

我用来配置数据网格的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 中完成它。

【问题讨论】:

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


    【解决方案1】:

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

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

    例如:

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

    用你自己的名字替换。

    PS:记得按照博客指示的所有步骤进行操作。

    【讨论】:

    • 您还需要在生成的metadata.cs 文件中将[Include] 添加到Make 的属性中(对于Cars 类)
    【解决方案2】:

    除非您在某处明确指定它(例如使用 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

    【讨论】:

    • 我知道 LoadOptions,但我想用 xaml 而不是 c# 来做
    • XAML 不知道 SQL 或查询之类的,它绑定到一个属性。如果属性的 get 访问器返回 null,您将看不到任何内容。这里没有魔法。
    • "xaml 绑定到一个属性" - 完全正确!我正在尝试绑定到 Cars 对象的 Make 属性,就像我绑定到 Cars 表中的 Car 属性一样。另请注意,我使用的是 RIA 服务,而不是直接访问 EF。
    【解决方案3】:

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

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

    您还可以将 SQL Profiler 附加到您的 SQL Server 实例并查看 EF 正在运行什么查询。

    【讨论】:

      【解决方案4】:

      Mike Hilberg 的文章解决了您感兴趣的大部分内容:

      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)。

      我最终得到了一个不雅的 hack,它确实损害了底层对象(你想避免的事情),这已经够难了。

      祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-08
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        相关资源
        最近更新 更多