WPF TreeView XML绑定代码在.NET 6.0失效但.NET Framework 4.7.2可用
.NET 6 WPF中XmlDataProvider绑定XML运行时失效的原因及解决方案
问题描述
做学习练习时,我尝试纯用XAML将XML数据加载到WPF TreeView控件,参考微软官方示例后,在Visual Studio 2022中创建.NET 6(TargetFramework=net6.0-windows)的WPF项目时,设计器能正常显示数据,但程序运行时却加载失败;而创建.NET Framework 4.7.2的项目则完全正常。我计划开发Windows 10上的小型C#/WPF应用,现在对.NET版本选择感到困惑,希望了解代码失效的原因,并得到项目选型建议。
相关代码
MainWindow.xaml
<Window x:Class="XMLTreeView.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:XMLTreeView" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Window.Resources> <XmlDataProvider x:Key="XmlData" Source="Tree.xml" XPath="Folders"/> <HierarchicalDataTemplate x:Key="ItemTemplate" ItemsSource="{Binding XPath=./Folder}"> <TextBlock Text="{Binding XPath=@Name}"/> </HierarchicalDataTemplate> </Window.Resources> <Grid> <TreeView Width="400" ItemsSource="{Binding Source={StaticResource XmlData}}" ItemTemplate="{Binding Source={StaticResource ItemTemplate}}"/> </Grid> </Window>
Tree.xml
<Folders> <Folder Name="Adolph Henselt"> <Folder Name="Henselt Piano Works" /> </Folder> <Folder Name="Alexander Borodin"> <Folder Name="String Quartet Nos. 1 and 2" /> <Folder Name="Symphony No. 2, Polovtsian Dances" /> </Folder> .... </Folders>
失效原因
- 文件复制行为差异:
.NET Framework和.NET 6+的WPF项目对非代码文件的默认复制规则不同:- .NET Framework中,XML文件默认的"复制到输出目录"属性是"如果较新则复制",编译时会把文件同步到输出文件夹,运行时程序能找到文件
- .NET 6的WPF项目中,XML文件默认该属性为"不复制",导致运行时输出目录里没有
Tree.xml,XmlDataProvider找不到数据源,绑定失效;而设计器直接读取项目中的源文件,所以能正常显示。
- XML语法错误:你的XML代码最后一行
</Folders缺少闭合的>,虽然设计器可能有容错处理,但建议修正避免后续问题。
解决方法
- 调整XML文件复制属性:在Visual Studio中选中
Tree.xml,打开属性窗口,将"复制到输出目录"改为"如果较新则复制"或"始终复制"。 - 修正XML语法:把最后一行的
</Folders改为</Folders>。
项目选型建议
针对Windows 10的小型WPF应用,优先选择**.NET 6/7/8**,理由如下:
- .NET 6+是微软长期支持(LTS)版本,后续维护更新周期更长,性能比.NET Framework更优。
- 支持最新的C#语法特性,能提升开发效率,简化代码逻辑。
- WPF在.NET Core 3.0之后就已成熟稳定,和Windows 10的兼容性完全没问题。
- 只有需要兼容已停止支持的Windows 7时,才考虑.NET Framework;否则没必要放弃.NET的新特性。
- 小型应用的迁移和适配成本极低,遇到的兼容性问题大多可通过调整配置或小幅度修改代码解决。
内容的提问来源于stack exchange,提问作者RETierney
相关产品推荐
相关产品推荐

