C# 如何在WPF列表框中获取选中项?

C# 如何在WPF列表框中获取选中项?,c#,.net,wpf,C#,.net,Wpf,我有一个WPF列表框,其中有复选框,但是如何获得选中的项目列表 列表框是绑定到字典的数据 以下是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="

我有一个WPF列表框,其中有复选框,但是如何获得选中的项目列表

列表框是绑定到
字典的数据

以下是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>

这通常通过ViewModel完成,ViewModel是一种数据结构,它向视图(通过DataContext)公开模型(您的数据)和视图特定信息,例如是否选中某个项

在您的示例中,您的字典不是字典,而是字典和PersonViewModel将有一个IsChecked属性和一个指向模型的Person属性

否则,您必须在模板中找到复选框,或者从复选框中找到列表框项,这会很快变得复杂。

Josh Smith有一个关于代码的项目,可以解释您需要什么。他正在讨论一个
TreeView
,但原则也将转移到
复选框中

还有一种非常有趣的方法,使用
DataTemplate
并将
复选框.IsChecked
属性绑定到
ListBoxItem.IsSelected
属性


如果你是MVVM的新手,你会有一个关于这个主题的精彩视频。它将引导您完成从使用代码隐藏文件到完整MVVM模式(包括依赖项注入和测试)的整个过程。

谢谢,这很有用。但是如何在代码中实现这一点呢?你有任何例子或链接吗?我同意@voidalliner的链接。另一个链接(也是Josh Smith的一篇文章)是。特别是关于IsChecked,看看他们把ViewModel属性放在模型的什么地方,但是想法是一样的。我喜欢论坛链接,类图很棒。我还为我的答案添加了Jason Dolinger链接。我举了一个例子,说明了如果使用包装器,那么如何在WPF中轻松创建选中的列表框,通过查看集合和测试IsChecked属性可以很容易地判断哪些项被选中。