【问题标题】:WPF Listbox with checkboxes multiple checking带有复选框的WPF列表框多次检查
【发布时间】:2011-02-28 01:23:07
【问题描述】:

我有一个 WPF 列表框,其中添加了复选框,目前它看起来像这样:

要选择所有不同的项目,我必须一个一个地单击每个复选框,或者全选(我有一个单独的按钮)。但是如果我只想选择一半,那就很痛苦了。

我希望能够做的是单击一个,按住 shift,单击另一个,然后单击其中一个旁边的复选框以切换所有选定的选项。我认为 Windows 窗体很容易实现这一点,但我不确定在 WPF 中该做什么?目前,我已将其设置为一次只允许选择一个(选择没有任何意义,全部与检查有关)。

理想情况下,我也有它,所以选择一些东西会检查它(即,你可以点击单词而不是选择小复选框)但我认为这可能很难用我的 shift+select 东西来做。

    <Window.Resources>
    <DataTemplate x:Key="ListBoxItemTemplate" >

        <WrapPanel>
            <CheckBox Focusable="False" IsChecked="{Binding Selected}" VerticalAlignment="Center" />
            <ContentPresenter Content="{Binding Name, Mode=OneTime}"  Margin="2,0" />
        </WrapPanel>

    </DataTemplate>

</Window.Resources>

<ListBox Margin="10" HorizontalAlignment="Stretch" Name="lbSheets" 
                 VerticalAlignment="Stretch" Width="Auto" Grid.Row="1" MinWidth="321"
                 MinHeight="40" HorizontalContentAlignment="Left" 
                 ItemTemplate="{StaticResource ListBoxItemTemplate}" VerticalContentAlignment="Top" Background="#FFDCEBEE" SelectionMode="Single">

</ListBox>

我希望这一切都有意义 - 在 WPF 中执行此操作的最佳方法是什么?

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    查看 SelectionMode 属性。请注意,在扩展模式下,您可以通过单击 ListBoxItem 文本或 CheckBox Shift-Click 项目组。阅读下面的文章,您会得到更好的想法

    http://www.codeproject.com/KB/WPF/WPFProblemSolving.aspx

    【讨论】:

    • 实际上,分隔的复选框看起来很奇怪,可能会导致用户混淆。
    • 复选框不必分开。您可以按照自己喜欢的方式实现。
    【解决方案2】:

    您需要使用扩展模式来使用 Shift 进行选择。您可以使用下一个代码来允许通过空格按钮检查所选项目(此类列表的本机行为):

    private void listBox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (!e.IsRepeat && e.Key == Key.Space)
        {
            bool notMixed = listBox.SelectedItems.Cast<object>().Any(item => ((yourItemsClass)item).Selected) ^
                            listBox.SelectedItems.Cast<object>().Any(item => !((yourItemsClass)item).Selected);
    
            foreach (var item in listBox.SelectedItems)
            {
                yourItemsClass t = (yourItemsClass)item;
                t.Selected = notMixed ? !yourItemsClass.Selected : true;
            }
        }
    }
    

    在此示例中:yourItemsClass 是您绑定到列表的源对象类。首先,您查看已经检查了哪些项目(notMixed 变量)。如果没有检查任何项目或选定范围内的某些项目,则在按空格键后,您只需检查其余项目。如果选中了所有选定的项目,则将它们全部取消选中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多