这是我的问题:
我有一个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(FilesListListBox)将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;
}
}
答案 0 :(得分:2)
不是仅在列表中添加文件名,而是添加CsvFile。为此,请将填充FilesListListBox的方式更改为:
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);
}
}
或者如果您想在一行中执行此操作并假设Settings.SelectedFilesList使用Linq支持AddRange:
Settings.SelectedFilesList.AddRange(FilesListListBox.SelectedItems.Cast<CsvFile>());