如何获取WPF ListBox中被选中的项目?

3

我有一个WPF ListBox,里面有复选框,但是怎么获取已选中的项目列表呢?

ListBox的数据绑定到一个Dictionary<T>

下面是XAML代码:

<Window x:Class="WpfApplication.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1"
        Height="300"
        Width="300">
    <Grid Margin="10">
        <ListBox ItemsSource="{DynamicResource Nodes}" Grid.IsSharedSizeScope="True" x:Name="MyList">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition SharedSizeGroup="Key" />
                            <ColumnDefinition SharedSizeGroup="Name" />
                            <ColumnDefinition SharedSizeGroup="Id" />
                        </Grid.ColumnDefinitions>
                        <CheckBox Name="NodeItem" Click="OnItemChecked">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Margin="2" Text="{Binding Value.Name}" Grid.Column="1"/>
                                <TextBlock Margin="2" Text="-" Grid.Column="2"/>
                                <TextBlock Margin="2" Text="{Binding Value.Id}" Grid.Column="3"/>
                            </StackPanel>
                        </CheckBox>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

我有一个示例,展示如何在WPF中轻松创建Checked Listbox。链接为http://www.jarloo.com/how-to-create-a-checkedlistbox-in-wpf/。如果您使用类似的包装器,那么只需查看集合并测试IsChecked属性即可轻松确定哪些项目已被选中。 - Kelly
2个回答

2
通常使用ViewModel来完成这个过程,它是一种数据结构,通过DataContext向视图公开模型(您的数据)和特定于视图的信息,例如项目是否已选中。
在您的示例中,您的Dictionary不会是一个Dictionary,而是一个Dictionary,PersonViewModel将具有IsChecked属性和指向模型的Person属性。
否则,您必须在模板中查找复选框或从复选框获取列表框项,这会很快变得复杂。

谢谢,这很有用。但是你如何在代码中实现这个?你有任何示例或链接吗? - Joan Venge
1
我同意@VoidDweller提供的链接。另一个链接(也是Josh Smith的文章)是http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。关于IsChecked,可以看看http://www.telerik.com/community/forums/wpf/treeview/getting-checked-items-using-mvvm.aspx,在那里他们将ViewModel属性放在模型中,但思路是相同的。 - Timores
MSDN的文章很好。我喜欢论坛链接,类图也很棒。我还在我的答案中加入了Jason Dolinger的链接。 - VoidDweller

2
Josh Smith在codeproject上有一篇文章,可以解释你需要的内容。他讨论了一个TreeView,但原则也适用于CheckBox
这里还有一种非常有趣的方法here,使用DataTemplateCheckBox.IsChecked属性绑定到ListBoxItem.IsSelected属性。
如果你是MVVM新手,Jason Dolinger有一段关于这个主题的优秀视频。它将引导你完成从使用代码后台文件到完整的MVVM模式,包括依赖注入和测试的过程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接