WPF MVVM模式下XamDataGrid绑定XML数据无法正常填充问题求助
问题原因及修复方案
1. 大小写不匹配导致XPath查询无结果
XML节点名称大小写敏感,你调试用的硬编码XML中使用的是小写<row>节点,但XAML绑定中写的是大写XPath=Row,无法匹配到任何行数据,因此网格为空。
修复建议:统一XML节点名和XPath规则,推荐按照你最初的设计统一使用大写
<Row>作为行节点名称。
2. 绑定路径配置错误
你直接将XmlDataProvider实例赋值给SelectedTableData,但XamDataGrid需要绑定的是XmlDataProvider执行查询后返回的节点集合,即Data属性,而非provider实例本身。
修复建议:要么在C#代码中直接把查询后的节点集合赋值给绑定属性,要么在XAML绑定中指定路径为
SelectedTableData.Data。
3. 自动生成列未显式开启
XamDataGrid需要显式开启自动生成列配置,才会根据XML节点的属性动态生成对应列,若关闭了该配置也会显示为空网格。
修复建议:在XamDataGrid属性中添加
AutoGenerateColumns="True"。
4. 布局配置导致控件收缩
你给XamDataGrid设置的HorizontalAlignment="Left" VerticalAlignment="Top",无数据时控件会自适应内容缩成小点,不利于调试。
修复建议:改为
HorizontalAlignment="Stretch" VerticalAlignment="Stretch",让控件占满父容器。
5. 未触发属性变更通知
MVVM模式下绑定的属性需要在值变更时触发INotifyPropertyChanged的PropertyChanged事件,否则UI收不到更新通知,不会刷新绑定。
修复建议:在SelectedTableData属性的setter中添加属性变更通知逻辑。
调整后代码示例
C# ViewModel代码
// 确保ViewModel实现了INotifyPropertyChanged接口 private XmlDataProvider _selectedTableData; public XmlDataProvider SelectedTableData { get => _selectedTableData; set { _selectedTableData = value; // 触发属性变更通知,这步不能少 OnPropertyChanged(nameof(SelectedTableData)); } } // 加载XML数据逻辑 private void LoadLookupTable() { XmlDocument lookupValueDoc = new XmlDocument(); // 统一使用大写<Row>节点,属性按设计放在节点属性中 string s = "<?xml version='1.0' ?><Root><Row test1=\"aaaa\" test2=\"bbbb\" testa=\"AAA\"/></Root>"; lookupValueDoc.LoadXml(s); XmlDataProvider provider = new XmlDataProvider { Document = lookupValueDoc, // 直接在provider层完成行节点查询 XPath = "/Root/Row" }; SelectedTableData = provider; }
XAML控件代码
<igDP:XamDataGrid Name="LookupGrid" Margin="5" GroupByAreaLocation="None" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" DataSource="{Binding SelectedTableData.Data}" AutoGenerateColumns="True" BorderThickness="1" BorderBrush="DarkCyan" ScrollViewer.VerticalScrollBarVisibility="Auto" RecordUpdated="LookupGrid_RecordUpdated" IsUndoEnabled="True" UndoLimit="50" DataSourceChanged="XamDataGrid_DataSourceChanged" Visibility="Visible" > <!-- 其余自定义配置 --> </igDP:XamDataGrid>
额外调试建议
如果修改后仍有问题,可以先把XamDataGrid替换为WPF原生DataGrid测试,若原生控件可以正常显示,则问题出在Infragistics控件的专属配置上,可在DataSourceChanged事件中手动遍历XML节点的属性,动态生成对应FieldLayout,每个字段的绑定路径设置为@属性名(比如@test1)即可。
内容的提问来源于stack exchange,提问作者DeadZone

