WPF中DynamicResource绑定XmlDataProvider修改XML后树视图不刷新
WPF下XmlDataProvider绑定TreeView节点新增后不刷新的解决方法
核心问题根因
- 代码中XML文档操作和XmlDataProvider的内置加载流程完全独立:新增节点时单独新建了
XmlDocument实例完成文件读写,和XmlDataProvider启动时自行从Source加载、持有的XML文档没有任何对象引用关联 - WPF本地资源缓存机制:XmlDataProvider通过
Source加载本地XML文件时,框架会对对应Uri的资源做缓存,即使手动调用Refresh(),也不会直接重新读取磁盘上刚修改完成的文件内容 - 绑定取值风险:通过
grid1.DataContext强转获取XmlDataProvider实例时,因为用了DynamicResource绑定,存在实例获取不匹配、绑定延迟的隐患
具体修改方案
方案1(推荐):直接操作XmlDataProvider持有的XML对象,绕开磁盘文件读写依赖
这是最稳定的实现方式,从根源上避免缓存和多实例不一致的问题:
- 直接从窗口资源字典获取XAML里定义的XmlDataProvider原始实例,不要从控件的DataContext强转获取
- 拿到Provider内部
Document属性持有的XML文档对象,直接在这个对象上执行节点新增操作 - 操作完成后手动触发刷新,因为原生
XmlDocument没有实现变更通知接口,节点修改不会自动传导到绑定层
修改后的后置代码片段:
private void xmladdnode() { // 从资源字典取原始Provider实例,避免绑定带来的实例不一致问题 XmlDataProvider provider = this.Resources["xmldata"] as XmlDataProvider; if (provider?.Document == null) return; // 直接在Provider持有的XML文档上操作 XmlNode rootNode = provider.Document.DocumentElement; XmlElement newNode = provider.Document.CreateElement("Node"); XmlAttribute nameAttr = provider.Document.CreateAttribute("name"); nameAttr.Value = "6"; newNode.Attributes.Append(nameAttr); rootNode.InsertAfter(newNode, rootNode.LastChild); // 可选:需要持久化时直接把当前Document对象存盘,不要单独新建Document读文件 provider.Document.Save(@"testdata.xml"); // 触发绑定刷新,让TreeView读取最新的节点内容 provider.Refresh(); }
注意:当给XmlDataProvider手动赋值
Document属性后,Provider会优先使用这份内存中的XML对象,不再自动读取Source指向的磁盘文件,完全绕开本地Uri缓存的问题。
方案2:保留磁盘文件读写逻辑时,强制清除缓存重新加载
如果确实需要先修改磁盘文件,再让TreeView加载新内容,需要在文件保存完成后,手动断开Provider和旧Source的关联,清除缓存后再重新关联:
// 原文件读写、保存逻辑完成后 XmlDataProvider provider = this.Resources["xmldata"] as XmlDataProvider; // 先清空Source,释放旧的缓存资源 provider.Source = null; // 重新指向原文件,强制框架重新加载磁盘上的最新内容 provider.Source = new Uri(@"testdata.xml", UriKind.RelativeOrAbsolute); provider.XPath = "/root"; provider.Refresh();
避坑提示
- 不要依赖XmlDataProvider自动感知磁盘文件变更,它内置没有文件监听机制,不主动触发重新加载的情况下,永远不会读取修改后的文件内容
- 操作XmlDocument完成节点增删改后,必须手动调用
Refresh(),原生XML对象的节点变更不会自动触发UI绑定更新 - 尽量避免用
DynamicResource绑定需要频繁操作的数据源,这类动态绑定在运行时存在解析延迟,用StaticResource绑定资源字典里的XmlDataProvider实例,稳定性会更高
内容的提问来源于stack exchange,提问作者Mamta Fogawat
相关产品推荐
相关产品推荐

