我正在尝试从xml文件中读取“Data”元素中的所有属性,并将它们显示在DataGrid(WPF,.Net 4.0)中
XML的格式如下所示。
<root>
<Data Name1="Value1" Name2="Value2" ... />
<Data Name1="Value1" Name2="Value2" ... />
...
</root>
我不知道所使用的属性名称(例如Name1,Name2,Foo等)或每个元素中的属性数(每个元素可能有不同数量的属性)。每个新元素都应该显示在一个新行上,每个属性对应一个列(如果该行不存在则显示为null)。
我正在努力为datagrid创建一个支持类来绑定,或者以编程方式创建它。
我目前的尝试是创建一组文本列(根据我从xml文件中提取的内容给出要使用的列名列表)
List<string> dataTags = ...; //get list of attributes to use from xml
foreach (string d in dataTags) {
DataGridTextColumn col = new DataGridTextColumn();
col.Header = d;
dataGrid.Columns.Add(col);
}
然后我遍历每个属性并将其添加到列表中(表示要在datagrid中显示的行),如果属性名称与其中一个标题值匹配
foreach (XElement e in xml.Descendants("Data")) {
//Store values to be added to the datagrid as a new row
List<string> row = new List<string>();
//Only add data where the attribute name matches one of the 'dataTags' we are given.
foreach(string d in dataTags) {
foreach (XAttribute a in e.Attributes()) {
if (d.Equals(a.Name.ToString())) {
row.Add(a.Value);
break;
}
}
}
//Add new row to the datagrid
dgData.Items.Add(row);
}
我有一些方法......但是有一个带空行的数据网格(正确的行数,但现在显示的是数据)。
任何提示/指示都将不胜感激。
答案 0 :(得分:0)
您动态创建列的代码是正确的。
但是您在数据网格中添加项目的代码不正确。在配置列时,为其分配XPATH。
List<string> dataTags = ...; //get list of attributes to use from xml
foreach (string d in dataTags)
{
DataGridTextColumn col = new DataGridTextColumn();
col.Binding = new Binding() { XPath = "@" + d } ;
col.Header = d;
dataGrid.Columns.Add(col);
}
然后将您的XmlNodes作为ItemsSource分配给datgrid ...
dataGrid.ItemsSource = xml.Descendants("Data");
此文还有使用XmlDataProvider
的文章