2011-09-15 6 views
5

En mi aplicación tengo una vista de lista con un estilo de contenedor de elementos ligado a la propiedad IsSelected en mi modelo de vista.Virtualización de Listview y anulación de la selección de todos los elementos

También he configurado un enlace de entrada en la vista de lista para manejar la selección de todos los elementos de la lista de forma programática, ya que el valor predeterminado no funciona debido al panel de pila de virtualización. Esto funciona bien.

El problema surge cuando el usuario hace clic en un solo elemento de la lista después de presionar CTRL + A. Lo que el usuario debe esperar es que el único elemento nuevo al que se hace clic se convierta en el único elemento seleccionado. Lo que sucede en realidad es que la vista de lista no actualiza la propiedad IsSelected para los elementos que no se ven, y solo los elementos actualmente visibles se vuelven no seleccionados.

¿Cómo puedo manejar este comportamiento correctamente?

<ListView 
    Name="sortList" 
    Grid.Row="1" 
    ItemsSource="{Binding RelativeSource={RelativeSource 
    FindAncestor, AncestorType={x:Type UserControl}}, 
    Path=ItemsSource, Mode=TwoWay}"> 
    <ListView.InputBindings> 
     <KeyBinding Gesture="CTRL+A" Command="{Binding SelectAllCommand}" /> 
    </ListView.InputBindings> 

    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      <Setter Property="Padding" Value="3" /> 
      <Setter 
       Property="IsSelected" 
       Value="{Binding Path=IsSelected, Mode=TwoWay}" /> 
     </Style> 
    </ListView.ItemContainerStyle> 
</ListView> 

Aquí está el comando seleccionar todo.

private RelayCommand _selectAllCommand; 
public System.Windows.Input.ICommand SelectAllCommand 
{ 
    get 
    { 
     if (_selectAllCommand == null) 
      _selectAllCommand = new RelayCommand(param => this.SelectAll()); 
     return _selectAllCommand; 
    } 
} 

private void SelectAll() 
{ 
    foreach (object o in this.Objects) 
     if (!this.SelectedItems.Contains(order)) 
      order.IsSelected = true; 
} 
+0

Por favor, publique su SelectAllCommand – Paparazzi

Respuesta

1

me encontré con el mismo problema y me ayudó con una clase personalizada derivada de Sytem.Windows.Controls.ListBox primordial OnSelectionChanged como se muestra aquí VirtualizingStackPanel + MVVM + multiple selection.

No es una solución perfecta en mi opinión, pero funciona.

+0

Estoy de acuerdo con usted. Pruebe esta solución: http://stackoverflow.com/a/29545790/2334614 – nvkokorin

Cuestiones relacionadas