我觉得这应该是一个简单的功能,但我不知道如何在不使用代码的情况下绑定到列表框中的选定项目。
我有一个包含复选框的Datatemplate的列表框。我想获取已选中/已选项的列表。我该怎么做?
如果我无法获取SelectedItems,我想绑定到触发" 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>
答案 0 :(得分:2)
一个正常的理性人会认为SelectedItems
应该是可以约束的。除了......它不是。那很糟糕。
您已经采用了常规方法,将IsSelected
绑定到数据对象中的属性,然后执行以下操作:
myCollection.Where(i => i.Selected);
根据MSDN SelectedItem
,如果模式设置为&#34; Multiple&#34;,则可以返回任何所选项目,因此其触发时序语义将转到至多是不确定的。在任何部分选择更改时获取通知将变得棘手,但是当Selected
属性发生更改时,您始终可以运行逻辑(例如,引发VM侦听的事件) )。
答案 1 :(得分:1)
您可以使用Interactivity扩展程序:
使用引用向导添加对System.Windows.Interactivity.dll的引用,在“扩展”部分中搜索。
然后在xaml中包含以下命名空间:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
你可以这样做:
<ListBox x:Name="FooList">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged" >
<i:InvokeCommandAction Command="{Binding FooCommand}" CommandParameter="{Binding SelectedItems, ElementName=FooList}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
在ViewModel中创建一个获取当前所选项目的ICommand。