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

时间:2014-11-19 05:37:50

标签: c# wpf silverlight data-binding datagrid

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

我从xml文件中读取了要在网格上显示的列的名称,仅为这些列运行查询并构造对象。我不知道类的名称或它们的属性(我从xml文件中读取它们),所以我不能声明它们。所以我留下了一个选项,为我从db读取的每一列声明一个类如下。

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

显然,当我尝试用网格绑定它时,它首先向我展示了一个像这样的InnerLists长度表

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

有没有什么方法可以将它与网格绑定在一起,它将内部列表作为列,将外部列表作为行?我的意思是我意识到这不会是一个简单的约束,但是因为我是银光的新手,所以对我来说任何帮助都是值得的。

1 个答案:

答案 0 :(得分:0)

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

  • 解析XML文件
  • 创建一个IList<Dictionary<string, object>>并使用XML文件中的标签/值对填充它
  • 为DataGrid为每个不同的列添加DataGridTextColumn&#34; LabelValueTypeGroup&#34;设置

所以你有一个像这样的DataGrid:

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

&#34; Items&#34;财产将是这样的:

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

解析XML文件后,填充&#34; Items&#34;集合和网格&#34;列&#34;组。请注意,绑定到字典条目的语法是Binding Path=[key]。所以populate-table代码看起来像这样:

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);
    }
}

当然你可能想要添加一些代码来转换&#34; Value&#34;从字符串到&#34; LabelValueTypeGroup&#34;中指定的任何类型;记录。


我只想注意完整性&#39;这个方法可以替代上述方法(对你的案子来说可能有点过分)。 Silverlight使用ICustomTypeProvider支持运行时输入。但它比WPF DataTable更难使用 - 基本上你必须继承System.TypeSystem.Property。这需要一些努力和反复试才能运行,但一旦正确设置,自定义类型将与Silverlight DataGrid无缝协作。但是,我会建议上面的方法为您的方案手动填充DataGrid,而不是这种自定义类型的方法。