WPF列表框和全选

Ray*_*Ray 12 wpf command listbox selectall

我想创建一个简单的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>
Run Code Online (Sandbox Code Playgroud)

SelectAllExecuted就是这样的:

private void SelectAllExecuted(object sender, ExecutedRoutedEventArgs e)
{
    listBox.SelectAll();
}
Run Code Online (Sandbox Code Playgroud)

如果列表框不在焦点上,则控制+ A有效.上下文菜单项正常工作.但是如果列表框是集中的,Control + A拒绝工作.

我觉得我正在与列表框作斗争,但我不应该这样做.

编辑:似乎我的整个问题都在于Multiple SelectionMode.如果我将它设置为Extended,则一切正常,但我不希望它在扩展模式下.

rmo*_*ore 18

正如Marco Zhou解释的那样,ListBox似乎有自己的内部命令用于Ctrl + A组合键.我们还可以通过尝试在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>
Run Code Online (Sandbox Code Playgroud)

将KeyBinding添加到ListBox后,当它具有焦点时,它现在将Ctrl + A路由回现有的SelectAll命令和SelectAllExecuted.


Gab*_*mer 5

对于像我这样最终在代码隐藏中完成所有操作的人:) ...

listBox.InputBindings.Add(new KeyBinding(ApplicationCommands.SelectAll, 
                          new KeyGesture(Key.A, ModifierKeys.Control)));
listBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, (_sender, _e) =>
{
    listBox.SelectAll();
}));
Run Code Online (Sandbox Code Playgroud)