WPF:无法在列表框中获取选定文件的列表

本文关键字:列表 获取 文件 WPF | 更新日期: 2023-09-27 18:03:00

我的问题是:

我有一个ListBox,我在点击按钮后添加项目:

var files = System.IO.Directory.GetFiles("c:'", "*.csv");
foreach (var file in files)
{
    string fileName = System.IO.Path.GetFileNameWithoutExtension(file);
    Settings.AllFilesList.Add(new CsvFile(fileName));
    FilesListListBox.Items.Add(fileName);
}

运行正常

现在,我的ListBox (fileslistbox)的SelectionMode设置为"Multiple"。我现在需要的是能够将选中的文件保存在一个名为SelectedFilesList的列表中。如上所示,所有文件都存储在一个名为AllFilesList的列表中。

我该怎么做呢?

我试着:

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    foreach (var file in FilesListListBox.SelectedItems)
    {
        Settings.SelectedFilesList.Add(file);
    }
}

,但它没有工作。我认为在上面的foreach循环中,每个文件对象都只是一个包含文件名的字符串,所以这就是它不起作用的原因。我的SelectedFilesList需要CsvFile类型的对象。

public class CsvFile
{       
    public string Name { get; set; }
    public CsvFile(string name)
    {
        Name = name;
    }
}

WPF:无法在列表框中获取选定文件的列表

不只是在列表中添加文件名,而是添加CsvFile。要做到这一点,请将fileslistbox的填充方式更改为:

var files = System.IO.Directory.GetFiles("c:''", "*.csv");
foreach (var file in files)
{
    string fileName = System.IO.Path.GetFileNameWithoutExtension(file);
    var csvFile = new CsvFile(fileName);
    Settings.AllFilesList.Add(csvFile);
    FilesListListBox.Items.Add(csvFile );
}

然后将DisplayMemberPath添加到FilesListListBox中,这样它就会显示名称,而不是执行CsvFile的ToString()。

FilesListListBox.DisplayMemberPath = "Name";

或者在XAML:

<ListBox Name="FilesListListBox" DisplayMemberPath="Name" />

编辑

这是你如何添加项目到你的集合后:

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    foreach (CsvFile file in FilesListListBox.SelectedItems)
    {
        Settings.SelectedFilesList.Add(file);
    }
}

或者如果你想在一行中做并且假设设置。SelectedFilesList支持AddRange使用Linq:

Settings.SelectedFilesList.AddRange(FilesListListBox.SelectedItems.Cast<CsvFile>());