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

时间:2010-03-26 00:19:03

标签: c# .net wpf

我有一个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>

2 个答案:

答案 0 :(得分:2)

这通常通过ViewModel完成,ViewModel是一种数据结构,它向模型(您的数据)和特定于视图的信息(如是否检查项目)公开(通过DataContext)。

在你的例子中,你的词典不会是一个词典,而是一个词典,而PersonViewModel会有一个IsChecked属性和一个指向模型的Person属性。

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

答案 1 :(得分:2)

Josh Smith在代码项目上有一个article,可以解释你需要什么。他正在讨论TreeView,但原则也会移到CheckBox

还有一个非常有趣的方法here使用DataTemplate并将CheckBox.IsChecked属性绑定到ListBoxItem.IsSelected属性。

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