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 执行操作。一旦您习惯了这种思维方式,它就会非常强大、灵活、高效且易于维护。代码隐藏是当所有其他合理途径都失败时,您为奇怪的情况所做的事情。例如,拖放。
有没有办法在 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 执行操作。一旦您习惯了这种思维方式,它就会非常强大、灵活、高效且易于维护。代码隐藏是当所有其他合理途径都失败时,您为奇怪的情况所做的事情。例如,拖放。