将对象列表列表绑定到 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的新手,任何帮助对我来说都是非常有价值的。
在 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.Type
和System.Property
。 这需要一些努力和反复试验才能运行,但是一旦正确设置,自定义类型将与 Silverlight DataGrid 无缝协作。 不过,对于你的方案,我再次推荐上述手动填充 DataGrid 的方法,而不是这种自定义键入方法。