WPF ListBox.SelectedItems 作为 ListBoxItem

WPF ListBox.SelectedItems as ListBoxItem

有没有办法在 SelectionChanged 事件中将 ListBox 的 selected 项目作为 ListBoxItem(在 ListBox 上)在 WPF 中?

现在,当我调用 listBox.SelectedItems 时,我得到了数据源格式的项目列表。

例如,当我创建 ListBox 时,我将它绑定到 CustomListBoxViewModel 作为数据源,所以当我调用 SelectedItems 时,我得到了 [=17= 的列表] objects.

谢谢!

编辑:

所选答案中给出的代码非常适合我的用例。

另一方面,我完全理解这是违反MVVM模式的。我将使用您在 xaml 视图的代码后面提供的代码。

我原来的问题背后的原因是我需要实现一个 ListBox,里面有一些禁用的 ListBoxItems。这些项目必须是 select 无法使用的。

我尝试在 ListBoxItems 上使用 Attached 属性 IsSelectable 但效果不佳。此附件 属性 受到此 post 的极大启发。问题是,当我直接 select 禁用一个项目时,附加的 属性 工作得很好。该项目无法 selected 并且它不在 SelectedItems collection 中。但是,如果我想通过按 CTRL+A select 所有项目,所有 ListBoxItems 都被 selected 甚至是禁用的项目,并且在 SelectedItems collection.

无论您这样做的原因是什么,这都可能是对 MVVM 的严重违反,您将在余生中深感遗憾。

但走向灭亡之路的第一步总是容易的。

方法如下:

var listBox = (ListBox)sender;
var selectedListBoxItems = 
    listBox.SelectedItems.Cast<Object>()
    .Select(item => (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item))
    .ToList();

当一切都以眼泪结束时,不要来找我哭。

不,但说真的, 有一些很好的理由在 WPF 中做这种事情,但它们远没有 WPF 新手所期望的那么普遍。几乎所有正常情况的最佳处理方式是让您的 C# 代码仅与您的数据项交互,并通过样式和模板对 XAML 中的 ListBoxItems 执行操作。一旦您习惯了这种思维方式,它就会非常强大、灵活、高效且易于维护。代码隐藏是当所有其他合理途径都失败时,您为奇怪的情况所做的事情。例如,拖放。