【问题标题】:Bind List of List of Object to DataGrid Silverlight将对象列表列表绑定到 DataGrid Silverlight
【发布时间】:2015-01-16 13:14:47
【问题描述】:

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

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

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

【问题讨论】:

  • 使用 System.Data.DataTable 或 System.Data.DataSet 让生活更轻松,并填充其内部表。有很多解释将 wpf / Silverlight(例如 DataGrid)绑定到 DataSet 的文档。
  • 两者都在 Silverlight 中不可用。
  • 我学到了一些东西。您可以将每一行视为一个视图模型,就像您已经写过的那样:ObservableCollection,并将其设置为 DataGrid 的 ItemsSource。为此不需要嵌套列表声明。

标签: c# wpf silverlight data-binding datagrid


【解决方案1】:

在 Silverlight 中,您可以将 DataGrid 绑定到 Dictionary&lt;string, object&gt; 类型的行。这将是您最容易走的路线:

  • 解析 XML 文件
  • 创建一个 IList&lt;Dictionary&lt;string, object&gt;&gt; 并使用 XML 文件中的标签/值对填充它
  • 为您的“LabelValueTypeGroup”集的每个不同列向 DataGrid 添加 DataGridTextColumn

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

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

“Items”属性如下所示:

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

解析 XML 文件后,填充“Items”集合和网格的“Columns”集。请注意,绑定到字典条目的语法是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 DataTable 更难使用——基本上你必须继承System.TypeSystem.Property。这需要一些努力和反复试验才能运行,但一旦设置正确,自定义类型将与 Silverlight DataGrid 无缝协作。不过,对于您的场景,我还是建议您使用上述手动填充 DataGrid 的方法,而不是这种自定义类型的方法。

【讨论】:

  • 很抱歉这么晚才回复。在 viewmodel 中,我将无法通过名称 "grid" 访问网格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2023-04-09
  • 2013-08-26
  • 2014-06-29
  • 2014-08-13
  • 2013-08-06
  • 1970-01-01
相关资源
最近更新 更多