【问题标题】:How to get checked items in a WPF ListBox?如何在 WPF ListBox 中获取选中的项目?
【发布时间】:2011-02-01 00:00:02
【问题描述】:

我有一个 WPF 列表框,其中有复选框,但是如何获取已检查项目的列表?

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 jarloo.com/how-to-create-a-checkedlistbox-in-wpf 中轻松制作已检查的列表框,如果您使用包装器,例如通过查看集合并测试很容易判断哪些项目已检查IsChecked 属性。

标签: c# .net wpf


【解决方案1】:

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

在您的示例中,您的 Dictionary 不会是 Dictionary,而是 Dictionary 并且 PersonViewModel 将具有 IsChecked 属性和指向模型的 Person 属性。

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

【讨论】:

  • 谢谢,这很有用。但是你如何在代码中做到这一点?您有任何示例或链接吗?
  • 我同意链接上的@VoidDweller。另一个链接(也是 Josh Smith 的一篇文章)是 msdn.microsoft.com/en-us/magazine/dd419663.aspx。具体关于 IsChecked,看看telerik.com/community/forums/wpf/treeview/…,他们将 ViewModel 属性放在模型中,但想法是一样的。
  • MSDN 文章不错。我喜欢论坛链接,类图很棒。我还在我的答案中添加了 Jason Dolinger 链接。
【解决方案2】:

Josh Smith 在 codeproject 上有一个 article,应该可以解释您的需求。他正在讨论TreeView,但原理也将移植到CheckBox。

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

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

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 2023-04-01
    • 2013-08-29
    • 2010-11-19
    • 2012-03-04
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多