WPF:无法在ListBox

时间:2016-08-19 08:24:31

标签: c# .net wpf xaml listbox

这是我的问题:

我有一个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;
    }
}

1 个答案:

答案 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>());