2009-06-23 22 views
11

Quiero crear un ListBox simple y tengo SelectAll como elemento de menú contextual. Sin embargo, parece que ListBox tiene algún tipo de manejo integrado para SelectAll que no puedo trabajar, pero está interfiriendo con mi intento de implementar SelectAll.WPF Listbox y Select All

Mi toda XAML es la siguiente:

<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 es simplemente esto:

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

Control + A funciona si el cuadro de lista no está enfocado. El elemento del menú contextual funciona correctamente. Pero Control + A se niega a trabajar si el cuadro de lista está enfocado.

Siento que estoy luchando contra el listbox, pero no debería necesitarlo.

Editar: Parece que mis problemas son todos con el Multiple SelectionMode. Si lo configuro en Extended, todo funciona, pero no lo quiero en modo extendido.

Respuesta

17

ListBox parece tener su propio comando interno para la combinación de teclas Ctrl + A, as Marco Zhou explains. También podemos probar esto al intentar colocar un punto de interrupción en los controladores Execute y Preview Execute. Como verá ninguno de los dos se alcanza cuando el ListBox tiene el foco y se presiona la combinación de teclas. Incluso cuando establecemos SelectionMode en Extended y podemos ver los elementos ser seleccionados por el comando, los manejadores aún no son alcanzados. Afortunadamente, podemos anular una InputGesture existente simplemente reasignándola. Podemos hacer esto en el ListBox para deshacernos de su manejo personalizado de Ctrl + A, y reasignarlo al comando ApplicationCommands.SelectAll.

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

Una vez que se añade el KeyBinding al cuadro de lista, cuando se ha enfocarla ahora enrutará Ctrl + A de nuevo a su comando Seleccionar Todo existente y SelectAllExecuted.

1

Para aquellos como yo que terminan haciendo todo en el código subyacente :) ...

listBox.InputBindings.Add(new KeyBinding(ApplicationCommands.SelectAll, 
          new KeyGesture(Key.A, ModifierKeys.Control))); 
listBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, (_sender, _e) => 
{ 
    listBox.SelectAll(); 
})); 
+0

en el caso de la mina por encima de xaml no funcionaba, pero el código detrás del trabajo perfecto. Gracias –

Cuestiones relacionadas