【问题标题】:How to select an item in a ListBox based on the order of the items as they appear on screen如何根据项目在屏幕上显示的顺序选择列表框中的项目
【发布时间】:2012-10-02 18:40:39
【问题描述】:

我的 WPF 应用程序中有一个 ListBoxListBox's ItemsSource 属性设置为我定义的对象集合。这些都来自UserControl

我需要按照它们出现在屏幕上的顺序循环遍历ListBox 中的项目。我相信我可以通过循环遍历 ListBox's Items 集合来做到这一点。

我相信这个集合中的对象是ListBoxItem 类型的。如何从ListBoxItem 获取我的类型的对象?换句话说,我如何获得从UserControl 继承自ListBoxItem 的类的实例?

编辑:

我应该首先包含的其他信息:

我需要按照它们出现在ListBox 中的顺序循环遍历Items,以便我可以选择最接近顶部的匹配特定条件的那个。找到我感兴趣的那个之后,我需要选择它。这是一个单选ListBox,所以一次只会选择一个项目。

所以,我的问题真的是:如何选择项目?

这并不重要,但我的类型从 UserControl 下降的原因是因为它包含许多控件,需要在 ListBox 中为每个项目显示。

【问题讨论】:

  • 问题标题没有描述问题根本,请更改它并省略标签,它们确实属于那里。跨度>
  • 这不应该是一个标签,它应该让读者知道我不是在谈论 WinForms ListBox。
  • 这正是标签的含义,它进行了分类。标签部分很好地达到了这个目的,绝大多数使用这个网站的人要么查看标签,要么按标签浏览,所以你不需要将它们放在问题中。

标签: wpf listbox listboxitem


【解决方案1】:

Items 正是您设置的对象或ItemsSource(通常应该是数据对象,而不是UserControls),因此您只需要将它们转换为您的类型。

这并不重要,但我的类型源自 UserControl 的原因是它包含许多需要在 ListBox 中为每个项目显示的控件。

不是一个很好的理由。在 WPF 中,您应该使用数据项并使用 data bindingdata templating 来显示带有相应控件的数据。

同样要选择一个给定的项,数据项应该有一个IsSelected 属性,然后可以在ItemsControl.ItemContainerStyle 中绑定到ListBoxItem.IsSelected 属性。

如果您随后在项目上将IsSelected 设置为true,则还应选择相应的ListBoxItem(您需要在项目上实现INotifyPropertyChanged)。

【讨论】:

  • 是的,你是对的。我没有正确陈述我的问题。请阅读我对问题的编辑。
【解决方案2】:

为什么不简单地选择符合条件的第一个项目:

Func<ItemType, bool> match =
    item =>
    {
        return ...; // a bool that indicates if the condition is matched
    };

listBox.SelectedItem = listBox.Items.Cast<ItemType>().FirstOrDefault(match);

【讨论】:

    【解决方案3】:

    我发现我需要以相反的顺序循环遍历 Items 集合中的项目。我不确定为什么会这样,我认为Items 集合按照它们在屏幕上出现的顺序保存了所有内容。可能是因为 ListBox 在基础数据的 DateTime 属性上按降序排序?

    无论如何,由于我必须向后循环,我最终不得不编写一个for 循环,该循环从集合的末尾开始并向前推进。由于我现在有了要选择的项目的索引,因此只需将 ListBox.SelectedIndex 设置为该索引即可。

    【讨论】:

    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多