WPF 列表框项目

Posted

技术标签:

【中文标题】WPF 列表框项目【英文标题】:WPF Listbox Items 【发布时间】:2013-08-23 18:53:58 【问题描述】:

我有一个 ListBox 控件,其中包含目录中的文件名。

我将如何遍历控件并获取这些名称?我试过了:

for (int i = 0; i < listboxFileGroups.Items.Count; i++)

    // I don't want to use properties that start with Selected           
    // Here is what I was looking for
    string textItem = listboxFileGroups.Items[i].ToString();

有什么建议吗?

【问题讨论】:

How would I iterate though the controls - 您不会在 WPF 中“遍历控件”。您创建一个适当的强类型数据模型并通过 DataBinding 将 UI 绑定到该模型,然后您操作数据,而不是 UI。发布您需要的屏幕截图,我可以告诉您在 WPF 中执行此操作的正确方法。 您的 ListBox 绑定到什么类型的对象?另外,您是说要获取 ListBox 中除 Selected 之外的所有项目吗? @DanielSimpkins,ListBox 使用绑定到字符串数组的 ViewModel。 @HighCore,我的措辞选择不当。我只是想遍历 ListBox 中的所有文本项。我现在有答案了。 为什么不遍历 ViewModel 中的字符串数组? 【参考方案1】:

您可能想探索一种 MVVM 方法。

在您的一个视图模型类中,您可以有一个ObservableCollection&lt;string&gt;

public ObservableCollection<string> StuffForListBox  get; set; 

使用您希望在 ListBox 中显示的内容填充该 ObservableCollection。 在包含 ListBox 的 UserControl 或 Window 的代码隐藏中,将 DataContext 设置为包含上面看到的 StuffForListBox 的类的实例。

this.DataContext = new MyClass();

或者,您也可以为用户控件/窗口创建一个数据模板,它会自动将数据上下文与您的视图模型关联起来。

由于您只提到要显示目录(不包括子目录)中的文件,因此只需将 ItemsSource 绑定到 StuffForListBox 即可。

   <ListBox ItemsSource="Binding StuffForListBox" ... >

要遍历 ListBox 中显示的字符串,您只需遍历 ObservableCollection。


如果您不想使用 MVVM 或第三方列表框,您可以尝试在代码隐藏中获取 ItemsSource 并循环执行,但我当然会推荐 MVVM。它会让您的生活更轻松。


现在,如果您想更疯狂地显示子文件夹之类的内容,那么 ObservableCollection&lt;string&gt; 将无法解决问题。您需要创建一个包含子文件夹的类来模拟文件夹如何包含文件和子文件夹。

 public class DemoItem
 
    public string Name  get; set; 
    public DemoItem Parent  get; set; 
    public ObservableCollection<DemoItem> Children  get; set; 
    public bool IsSelected  get; set; 
 

...然后将绑定到列表框的可观察集合基于上述类。

如果您这样做,您的列表框将无法正确显示项目,直到您创建 DataTemplate 但我想这不在问题的范围内:p

【讨论】:

以上是关于WPF 列表框项目的主要内容,如果未能解决你的问题,请参考以下文章

带有彩色项目的 wpf 列表框

WPF 列表框项目

无法选择 wpf 列表框项目

WPF:删除样式列表框中焦点项目周围的虚线边框

选定的 WPF 列表框绑定仅更新视图中的项目

列表框项目的 DataTemplate 中 IsSelected 的 WPF 触发器