是否可以在WPF中ListBox
(ListBoxItem
)事件中将SelectionChanged
的所选项目作为ListBox
?
现在,当我拨打listBox.SelectedItems
时,我会以数据源的格式获取项目列表。
例如,当我创建ListBox
时,我将其绑定到CustomListBoxViewModel
作为数据源,因此当我调用SelectedItems
时,我会得到CustomListBoxViewModel
个对象的列表
谢谢!
编辑:
所选答案中给出的代码完全适用于我的用例。
另一方面,我完全理解这违反了MVVM模式。我将使用您在xaml视图后面的代码中提供的代码。
我原来的问题背后的原因是我需要实现一个ListBox
内部有一些禁用ListBoxItems
。那些物品必须是不可选择的。
我尝试在ListBoxItems
上使用附加属性 IsSelectable ,但效果不佳。这个附属的财产受到了这个post的启发。问题是,当我直接选择一个禁用的项目时,附加的属性工作得很好。无法选择该项,它不在 SelectedItems 集合中。但如果我想通过按CTRL + A选择所有项目,则所有ListBoxItems
都被选中,即使是已禁用的项目,也可以在 SelectedItems 集合中找到。
答案 0 :(得分:4)
无论你为此做出什么样的理由,这可能是对MVVM的严重侵犯,你会对你的余生感到非常后悔。
但走向灭亡之路的第一步总是很容易。
以下是:
var listBox = (ListBox)sender;
var selectedListBoxItems =
listBox.SelectedItems.Cast<Object>()
.Select(item => (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item))
.ToList();
当泪水全部结束时,请不要向我哭泣。
不,但严重的是,是在WPF中做这种事情的一些很好的理由,但它们远没有WPF所期望的人那么普遍。几乎任何正常情况最好通过让您的C#代码仅与您的数据项交互来处理,并通过样式和模板对XAML中的ListBoxItems进行处理。一旦你习惯了这种思维方式,它就会变得非常强大,灵活,高效且易于维护。当所有其他合理途径都失败时,Codebehind就是你所做的奇怪案例。例如,拖放。