在WPF项目里,把XML数据直接绑定到DataGrid可以避免手动解析和循环赋值,利用框架自带的绑定机制就能把节点变成表格行。下面先看一个最基础的示例。

使用XmlDataProvider在XAML中静态绑定
可以在XAML里嵌入XmlDataProvider,把XML作为资源,然后用DataGrid的ItemsSource绑定到指定节点。注意XPath用来定位要展示的重复节点。
<Window x:Class="XmlGridDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="XML绑定示例" Height="350" Width="525">
<Window.Resources>
<XmlDataProvider x:Key="BookData" XPath="/Books">
<x:XData>
<Books xmlns="">
<Book>
<Name>C#入门</Name>
<Price>39</Price>
</Book>
<Book>
<Name>WPF实战</Name>
<Price>59</Price>
</Book>
</Books>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{Binding Source={StaticResource BookData}, XPath=Book}">
<DataGrid.Columns>
<DataGridTextColumn Header="书名" Binding="{Binding XPath=Name}"/>
<DataGridTextColumn Header="价格" Binding="{Binding XPath=Price}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
上面代码中,XmlDataProvider的XPath设为/Books,表示根节点;DataGrid绑定XPath=Book,表示取所有Book子节点;列里面再用XPath=Name取对应字段。
后台C#代码动态加载XML文件
更多时候XML来自文件或接口,这时可以在C#里读取并赋值给DataGrid。
using System.Windows;
using System.Windows.Data;
using System.Xml;
namespace XmlGridDemo
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// 从文件加载XML
XmlDocument doc = new XmlDocument();
doc.Load("books.xml");
XmlDataProvider provider = new XmlDataProvider();
provider.Document = doc;
provider.XPath = "/Books/Book";
Binding binding = new Binding();
binding.Source = provider;
myGrid.SetBinding(DataGrid.ItemsSourceProperty, binding);
}
}
}
在XAML里给DataGrid起名myGrid,后台创建XmlDataProvider并指定XPath,再用SetBinding把ItemsSource连上即可。
常见注意点
- 如果XML带命名空间,XPath要加前缀映射,否则取不到节点。
- DataGrid自动列有时显示不对,建议像示例一样手写DataGridTextColumn并配XPath。
- 节点文本用Binding的XPath,不要用Path,因为数据源是XML DOM不是对象。
总结:C#把XML绑定到WPF的DataGrid主要靠XmlDataProvider加XPath,无论写在XAML还是后台代码,思路都是把XML变成带路径的绑定源。