WPF ListBox.SelectedItems 作为 ListBoxItem

Eve*_*ner 1 c# data-binding wpf xaml wpf-controls

有没有办法在 WPF中的事件(在)中将a 的选定项目ListBox作为 a ?ListBoxItemSelectionChangedListBox

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

例如,当我创建 my 时,ListBox我将它绑定到 aCustomListBoxViewModel作为数据源,因此当我调用时,SelectedItems我会得到一个CustomListBoxViewModel对象列表。

谢谢!

编辑:

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

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

我最初的问题背后的原因是我需要实现一个里面ListBox有一些残疾人的ListBoxItems。这些项目必须是不可选择的。

我尝试在我的设备上使用附加属性IsSelectableListBoxItems,但效果不佳。这个附加的财产受到这篇文章的极大启发。问题是,当我直接选择禁用项目时,附加属性工作得很好。无法选择该项目并且它不在SelectedItems集合中。但是,如果我想通过按 CTRL+A 来选择所有项目,那么所有项目都会ListBoxItems被选中,甚至是禁用的项目,并在SelectedItems集合中找到。

15e*_*153 5

无论您出于何种原因这样做,这可能是对 MVVM 的严重违反,您将为此深感遗憾。

但通往灭亡之路的第一步总是容易的。

就是这样:

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

当这一切都以泪水结束时,请不要向我哭泣。

没有,但严重的是,还有的一些很好的理由做这种事情在WPF,但他们很不常见的比别人新的WPF期望的那样。通过让 C# 代码仅与数据项交互,并通过样式和模板对 XAML 中的 ListBoxItems 进行处理,几乎任何正常情况都可以得到最好的处理。一旦习惯了这种思维方式,它就会非常强大、灵活、高效且可维护。当所有其他合理途径都失败时,代码隐藏是您对奇怪情况所做的事情。例如,拖放。

  • 我完全理解这是不好的。我在我的问题的编辑中添加了我问这个的原因。也许有更好的方法来做到这一点。 (2认同)
  • @m.lachance 阅读您更新的问题后,我的第一反应是“哦,伙计,只需将其添加到代码隐藏中即可”。这绝对是您在代码隐藏中经常做的事情——附加属性解决方案可能更好,但通常现实世界的时间表不允许您构建帕台农神庙。但偷帕台农神庙是另一回事。我会看看那个 coderelief.net 帖子,看看该代码是否适合我。 (2认同)