这可能听起来很奇怪,但首先要阅读为什么我要这样做。
我从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
有没有什么方法可以将它与网格绑定在一起,它将内部列表作为列,将外部列表作为行?我的意思是我意识到这不会是一个简单的约束,但是因为我是银光的新手,所以对我来说任何帮助都是值得的。
答案 0 :(得分:0)
在Silverlight中,您可以将DataGrid绑定到Dictionary<string, object>
类型的行。这将是您最简单的路线:
IList<Dictionary<string, object>>
并使用XML文件中的标签/值对填充它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.Type
和System.Property
。这需要一些努力和反复试才能运行,但一旦正确设置,自定义类型将与Silverlight DataGrid无缝协作。但是,我会建议上面的方法为您的方案手动填充DataGrid,而不是这种自定义类型的方法。