将对象列表列表绑定到 DataGrid Silverlight

本文关键字:列表 DataGrid Silverlight 绑定 对象 | 更新日期: 2023-09-27 18:30:52

这听起来可能很奇怪,但首先阅读我为什么要这样做。

我从 xml 文件中读取要在网格上显示的列的名称,仅对这些列运行查询并构造一个对象。我不知道类的名称或其属性(我从 xml 文件中读取它们),所以我无法声明它们。因此,我可以选择为从数据库读取的每一列声明一个类,如下所示。

public class LabelValueTypeGroup
{
    public string Label { get; set; }
    public string Type { get; set; }
    public string Value { get; set; }
}

这是一列。所以一行将是

List<LabelValueTypeGroup> or ObservableCollection<LabelValueTypeGroup>

然后整个桌子将是

List<List<LabelValueTypeGroup>> or ObservableCollection<ObservableCollection<LabelValueTypeGroup>>

显然,当我尝试用网格绑定它时,它首先向我展示了一个 InnerList 的长度表,如下所示

4
4
4
4
4
4
4
4

在将其与列表的第一个索引绑定时,它会显示

Label   Value    Type    
ID      435      System.Decimal
Name    John     System.String
Phone   3453113  System.String
Email   j@j.com  System.String

有什么方法可以将它与网格绑定,将内部列表作为列,将外部列表作为行?我的意思是,我意识到这不是一个简单的绑定,但是由于我是Silverlight的新手,任何帮助对我来说都是非常有价值的。

将对象列表列表绑定到 DataGrid Silverlight

在 Silverlight 中,可以将 DataGrid 绑定到Dictionary<string, object>类型行。 这将是您最简单的路线:

  • 解析 XML 文件
  • 创建一个IList<Dictionary<string, object>>并使用 XML 文件中的标签/值对填充它
  • 为"LabelValueTypeGroup"设置的每个不同列向数据网格添加一个DataGridTextColumn

因此,您将拥有如下所示的数据网格:

<sdk:DataGrid x:Name="grid" ItemsSource="{Binding Items}" />

"Items"属性将如下所示:

public ObservableCollection<Dictionary<string, object>> Items { get; private set; }

解析 XML 文件后,填充"项"集合和网格的"列"集。 请注意,绑定到字典条目的语法是 Binding Path=[key] 。 因此,填充表代码应如下所示:

public void FillTable(List<List<LabelValueTypeGroup>> rows)
{
    var columnSet = rows.SelectMany(row => row.Select(col => col.Label)).Distinct();
    foreach (var columnLabel in columnSet)
    {
        columnSet.Add(columnLabel);
        var gridColumn = new DataGridTextColumn 
        { 
            Binding = new Binding(string.Format("[{0}]", columnLabel)),
            Header = columnLabel,
        };
        grid.Columns.Add(gridColumn);
    }
    foreach (var row in rows)
    {
        var item = new Dictionary<string, object>();
        foreach (var col in row)
        {
            item[col.Label] = col.Value;
        }
        Items.Add(item);
    }
}

当然,您可能希望添加一些代码,将"Value"从字符串转换为"LabelValueTypeGroup"记录中指定的任何类型。


为了完整起见,我只是想指出,上述方法还有另一种选择(对于您的情况来说可能矫枉过正)。 Silverlight 确实支持运行时键入,使用 ICustomTypeProvider 。 不过,它比 WPF 数据表更难使用 - 基本上您必须继承System.TypeSystem.Property。 这需要一些努力和反复试验才能运行,但是一旦正确设置,自定义类型将与 Silverlight DataGrid 无缝协作。 不过,对于你的方案,我再次推荐上述手动填充 DataGrid 的方法,而不是这种自定义键入方法。