如何在WPF ListView中将加载的文件名拆分至不同列?
解决方案:WPF中拆分文件名并实现表格展示、多选与排序
问题背景
有一批命名规则为name_number1_number2_number3.txt的TXT文件(示例:abcde_0045_0002_1001.txt),需要在WPF应用中实现:
- 将文件名拆分为Name、Num1、Num2、Num3四列展示
- 支持多行选中,获取选中文件的全名用于后续处理
- 未来需支持按列排序
之前尝试用Split方法拆分文件名到数组后绑定ListView失败,也尝试过DataGrid但未解决问题。
最优实现方案
1. 控件选择:DataGrid是最优选择
相比ListView,DataGrid原生支持列排序、数据绑定、多选,且表格布局更适配多列数据展示,无需手动配置复杂的GridView模板,完全满足当前及未来排序需求。
2. 核心实现思路
创建一个实体类封装拆分后的文件信息,通过数据绑定将实体列表绑定到DataGrid,避免直接操作数组或FileInfo对象,简化数据展示与后续操作。
3. 具体代码实现
步骤1:创建文件信息实体类
public class TxtFileInfo { public string Name { get; set; } public string Num1 { get; set; } public string Num2 { get; set; } public string Num3 { get; set; } public string FullName { get; set; } // 保存文件全名,用于后续处理 public TxtFileInfo(FileInfo fileInfo) { FullName = fileInfo.FullName; // 拆分文件名(去掉后缀) var fileNameWithoutExt = Path.GetFileNameWithoutExtension(fileInfo.Name); var parts = fileNameWithoutExt.Split('_'); // 确保拆分结果符合规则,避免数组越界 if (parts.Length >= 4) { Name = parts[0]; Num1 = parts[1]; Num2 = parts[2]; Num3 = parts[3]; } else { // 处理不符合命名规则的文件 Name = fileInfo.Name; Num1 = Num2 = Num3 = "无效格式"; } } }
步骤2:修改后台代码,加载并转换数据
public MainWindow() { InitializeComponent(); LoadTxtFiles(); } private void LoadTxtFiles() { var directory = new DirectoryInfo(@"C:\txt"); var txtFiles = directory.GetFiles("*.txt"); // 将FileInfo转换为自定义实体列表 var fileList = txtFiles.Select(file => new TxtFileInfo(file)).ToList(); // 绑定到DataGrid TxtDataGrid.ItemsSource = fileList; } // Process按钮点击事件:获取选中文件全名 private void ProcessButton_Click(object sender, RoutedEventArgs e) { var selectedFiles = TxtDataGrid.SelectedItems.Cast<TxtFileInfo>().ToList(); foreach (var file in selectedFiles) { // 这里处理选中的文件,比如获取FullName Console.WriteLine(file.FullName); } }
步骤3:修改XAML,使用DataGrid
<DockPanel> <Button DockPanel.Dock="Bottom" Content="Process" Click="ProcessButton_Click"/> <DataGrid x:Name="TxtDataGrid" SelectionMode="Extended" CanUserSortColumns="True" AutoGenerateColumns="False" DockPanel.Dock="Top"> <DataGrid.Columns> <!-- 可选:添加复选框列,与选中状态联动 --> <DataGridCheckBoxColumn Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=IsSelected}" Header="选择"/> <DataGridTextColumn Header="Name" Binding="{Binding Name}" SortMemberPath="Name"/> <DataGridTextColumn Header="Num1" Binding="{Binding Num1}" SortMemberPath="Num1"/> <DataGridTextColumn Header="Num2" Binding="{Binding Num2}" SortMemberPath="Num2"/> <DataGridTextColumn Header="Num3" Binding="{Binding Num3}" SortMemberPath="Num3"/> </DataGrid.Columns> </DataGrid> </DockPanel>
4. 关键说明
- 实体类中通过
Path.GetFileNameWithoutExtension正确获取无后缀的文件名,避免拆分时包含.txt - DataGrid的
CanUserSortColumns="True"开启原生排序功能,点击列头即可排序 SelectionMode="Extended"支持按住Ctrl/Shift多选,与ListView的Multiple模式一致- 通过
SelectedItems.Cast<TxtFileInfo>()可以直接获取选中的实体对象,轻松拿到FullName
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

