我有一个WPF列表框,其中添加了复选框,目前它看起来像这样:
要选择所有不同的项目,我必须逐个单击每个复选框,或者选择全部(我有一个单独的按钮)。但如果我只想选择一半,那就太痛苦了。
我希望能够做的是单击一个,按住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中执行此操作的最佳方式是什么?
答案 0 :(得分:3)
查看SelectionMode属性。请注意,在扩展模式下,您可以通过单击ListBoxItem文本或CheckBox来按住Shift键并单击项目组。阅读以下文章,您将获得更好的主意
答案 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变量)。如果未选中任何选定范围内的任何项目或某些项目,则在空格按下后,您只需检查其余项目。如果选中了所有选定的项目,则取消选中所有项目。