我觉得这应该是一个简单的功能,但我不知道如何在不使用隐藏代码的情况下绑定(bind)到列表框中的所选项目。
我有一个带有包含复选框的数据模板的列表框。我想获取已检查/选定项目的列表。我该怎么做?
如果我无法获取 SelectedItems,我想绑定(bind)到每次选择某些内容时触发“SelectedProduct”的内容,以便我可以迭代“ProductList”并找到选中的项目。但是,每次我单击某个项目时,SelectedItem 不会触发。
这是我的代码:
<ListBox ItemsSource="{Binding ProductList}" SelectedItem="{Binding SelectedProduct}" SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Content="{Binding ID}" Margin="2"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsChecked}"/>
</Style>
</ListBox.ItemContainerStyle>
最佳答案
一个正常的理性人会认为SelectedItems
应该是可绑定(bind)的。但……事实并非如此。这很糟糕。
您已经采用了通常的方法,将 IsSelected
绑定(bind)到数据对象中的属性,然后执行如下操作:
myCollection.Where(i => i.Selected);
根据MSDN如果模式设置为“Multiple”,SelectedItem
可以返回任何 选定项,因此其触发计时语义最多是未定义的。当选择的任何部分发生变化时获取通知将会很棘手,但您始终可以在 Selected 属性发生更改时运行逻辑(例如,引发一个事件VM 监听)。
关于c# - 获取列表框选定的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29237852/