带有复选框多重检查的WPF列表框

时间:2011-02-28 01:23:07

标签: c# .net wpf

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

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

我希望能够做的是单击一个,按住shift,单击另一个,然后单击其中一个旁边的复选框以切换所有选定的复选框。我认为Windows Forms允许这很容易,但我不确定在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中执行此操作的最佳方式是什么?

2 个答案:

答案 0 :(得分:3)

查看SelectionMode属性。请注意,在扩展模式下,您可以通过单击ListBoxItem文本或CheckBox来按住Shift键并单击项目组。阅读以下文章,您将获得更好的主意

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

答案 1 :(得分:-1)

您需要使用扩展模式选择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是绑定到list的源对象类。首先,查看已检查的项目(notMixed变量)。如果未选中任何选定范围内的任何项目或某些项目,则在空格按下后,您只需检查其余项目。如果选中了所有选定的项目,则取消选中所有项目。