获取ListBox SelectedItems

时间:2015-03-24 16:23:03

标签: c# wpf xaml mvvm listbox

我觉得这应该是一个简单的功能,但我不知道如何在不使用代码的情况下绑定到列表框中的选定项目。

我有一个包含复选框的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>

2 个答案:

答案 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。