选择项目时无法清除列表框

Posted

技术标签:

【中文标题】选择项目时无法清除列表框【英文标题】:Can't clear ListBox while item is selected 【发布时间】:2021-04-11 19:30:45 【问题描述】:

你好,今天我正在试验 WPF,我发现当 ListBox 有一个选定的项目时,它不允许修改它并挂起应用程序

        private void Button_Click_7(object sender, RoutedEventArgs e)
    
        ScriptBox.Items.Clear();
        Functions.PopulateListBox(ScriptBox, "./Scripts", "*.txt");
        Functions.PopulateListBox(ScriptBox, "./Scripts", "*.lua");
    

我是 WPF 的新手,因此找出发生这种情况的原因会很有帮助。

编辑:可能是 Mscorelib.dll(不是)

编辑:Pure Catch 与 Peregrine 的改进一起工作

【问题讨论】:

使用前请记得阅读标签说明,以免误用。您的问题与 Visual Studio 应用程序无关,因此 [visual-studio] 标记不相关。 【参考方案1】:

即使您不打算走完整的 MVVM 路线,将应用程序的数据与 UI 控件分开仍然是一个好主意。

1] 在 Window 的构造函数中,创建一个 ObservableCollection<string> 并将其设置为 ScriptBox 控件的 ItemsSource

private ObservableCollection<string> _scriptBoxCollection;

public MyView()

    _scriptBoxCollection = new ObservableCollection<string>();
    ScriptBox.ItemsSource = _scriptBoxCollection ;
       

2] 更改您的 PopulateListBox() 方法以仅返回文件名集合。在Single Responsibility Principle之后,这些方法不应该关心它们生成的数据是如何使用的。

public ReadOnlyCollection<string> GetMatchingFiles(string folder, string fileSpec)  ... 

返回值为ReadOnlyCollection&lt;T&gt;与Microsoft guidelines一致。

3] 更改按钮单击处理程序,使其更新可观察集合。

private void Button_Click_7(object sender, RoutedEventArgs e)

    _scriptBoxCollectionClear();

    foreach(var item in Functions.GetMatchingFiles("./Scripts", "*.txt")
        _scriptBoxCollection.Add(item);

    Functions.GetMatchingFiles("./Scripts", "*.lua")
        _scriptBoxCollection.Add(item);

ForEach 结构是必需的,因为标准 ObservableCollection 不支持 AddRange()


将此添加到 Functions.cs(并弃用 PopulateListBox() 和任何其他将数据直接写入 UI 控件的类似方法)

public static ReadOnlyCollection<string> GetMatchingFiles(string folder, string fileType) 

    var result = new List<string>();
    var dinfo = new DirectoryInfo(folder); 
    var files = dinfo.GetFiles(fileType); 
    foreach (var file in files) 
     
        result.Add(file.Name); 
     
    
    return result.AsReadOnly();

【讨论】:

谢谢这么多,只是我不太擅长 Wpf 来实现它,但它帮助了我 等待它可能是 MScorlib.dll 的问题 我很喜欢这条Thogh Oof In Funtions.cs public static void PopulateListBox(System.Windows.Controls.ListBox lsb, string Folder, string FileType) DirectoryInfo dinfo = new DirectoryInfo(Folder); FileInfo[] 文件 = dinfo.GetFiles(FileType); foreach(文件中的 FileInfo 文件) lsb.Items.Add(file.Name); 将不允许我使用这可能是如何编码的 @Pak 这看起来像 20 年前的 winforms 代码,而不是现代 WPF。我在上面添加了示例代码,展示了如何生成和使用匹配文件列表。【参考方案2】:

您尝试过使用ScriptBox.UnselectAll()ScriptBox.SelectedIndex = -1 吗?

假设 ScriptBox 是您的列表框。

【讨论】:

OMG THX 这么多

以上是关于选择项目时无法清除列表框的主要内容,如果未能解决你的问题,请参考以下文章

访问使用列表框中选择的项目更新子表单

Access VBA Listbox.Requery 命令清除列表项

vb中图片框如何清除里面的所有内容?

无法选择 wpf 列表框项目

选择列表框项目时,在另一个列表框中显示相关数据

无法连续两次从列表框中选择相同的项目 - windows phone 8 C#