WPF列表框和全选

15

我想创建一个简单的ListBox,并在上面添加一个名为“SelectAll”的右键菜单项。但是似乎ListBox已经有了一种内置的处理方式来实现SelectAll,我无法让它正常工作,这干扰了我尝试实现SelectAll功能的尝试。

我的整个XAML如下:

<Window x:Class="WpfApplication1.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">
    <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.SelectAll"
                        Executed="SelectAllExecuted" />
    </Window.CommandBindings>
    <DockPanel>
        <CheckBox DockPanel.Dock="Top">My Checkbox</CheckBox>
        <ListBox Name="listBox" SelectionMode="Multiple">
            <ListBox.ContextMenu>
                <ContextMenu>
                    <MenuItem Command="ApplicationCommands.SelectAll" />
                </ContextMenu>
            </ListBox.ContextMenu>
        </ListBox>                
    </DockPanel>
</Window>

SelectAllExecuted 就是这样的:

private void SelectAllExecuted(object sender, ExecutedRoutedEventArgs e)
{
    listBox.SelectAll();
}

如果ListBox没有焦点,则Control + A有效。上下文菜单项工作正常。但是,如果ListBox具有焦点,则Control + A无法工作。

我觉得我在与ListBox斗争,但我不应该需要这样。

编辑:似乎我的所有问题都与多重选择模式有关。如果将其设置为Extended,则一切都有效,但我不想使用Extended模式。

2个回答

21

ListBox似乎有自己内部的Ctrl+A键组合命令,正如Marco Zhou解释的那样。我们可以尝试在Execute和Preview Execute处理程序中设置断点进行测试。当ListBox拥有焦点并且按下该键组合时,你会发现这两个处理程序都没有被执行。即使我们将SelectionMode设置为Extended并且可以通过该命令观察到选择项被选中,处理程序也没有被执行。幸运的是,我们可以通过重新分配现有的InputGesture来覆盖已有的输入手势。我们可以在ListBox中这样做,以消除其自定义的Ctrl+A处理,并将其重新分配给ApplicationCommands.SelectAll命令。

<ListBox Name="listBox"
         SelectionMode="Multiple">
    <ListBox.InputBindings>
        <KeyBinding Command="ApplicationCommands.SelectAll"
                    Modifiers="Ctrl"
                    Key="A" />
    </ListBox.InputBindings>            
    ...
</ListBox>

一旦将KeyBinding添加到ListBox中,当它获得焦点时,现有的SelectAll命令和SelectAllExecuted将会路由Ctrl+A。


4
对于像我这样最终在代码后端执行所有操作的人 :) ...
listBox.InputBindings.Add(new KeyBinding(ApplicationCommands.SelectAll, 
                          new KeyGesture(Key.A, ModifierKeys.Control)));
listBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, (_sender, _e) =>
{
    listBox.SelectAll();
}));

在我的XAML上面似乎不起作用,但是代码后台完美运行。谢谢。 - Ravi Anand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接