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集合中找到。
无论您出于何种原因这样做,这可能是对 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 进行处理,几乎任何正常情况都可以得到最好的处理。一旦习惯了这种思维方式,它就会非常强大、灵活、高效且可维护。当所有其他合理途径都失败时,代码隐藏是您对奇怪情况所做的事情。例如,拖放。