You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:05:46