2011-09-15 14 views
5

W mojej aplikacji mam widok listy ze stylem kontenera elementu powiązanym z właściwością IsSelected w moim modelu widoku.Wyświetlenie wirtualizacji i odznaczenie wszystkich elementów

Mam również ustawić powiązanie wejścia na liście, aby obsłużyć wybór wszystkich elementów na liście programowo, ponieważ ustawienie domyślne nie działa z powodu panelu stosu wirtualizacji. Działa to dobrze i dobrze.

Problem pojawia się, gdy użytkownik klika pojedynczy element listy po naciśnięciu CTRL + A. To, co powinien się spodziewać użytkownik, to pojedynczy nowy element kliknięty staje się jedynym wybranym elementem. W rzeczywistości listview nie aktualizuje właściwości IsSelected dla obiektów poza zasięgiem wzroku, a tylko aktualnie widoczne elementy stają się niezaznaczone.

Jak prawidłowo obsłużyć to zachowanie?

<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> 

Oto polecenie wyboru wszystkich.

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

Proszę zaksięgować swoją SelectAllCommand – Paparazzi

Odpowiedz

1

natknąłem się na ten sam problem i pomógł sobie z niestandardowej klasy pochodzący z Sytem.Windows.Controls.ListBox nadrzędnym OnSelectionChanged jak pokazano tutaj VirtualizingStackPanel + MVVM + multiple selection.

Nie jest to idealne rozwiązanie w moich oczach, ale działa.

+0

Zgadzam się z Państwem. Wypróbuj to rozwiązanie: http://stackoverflow.com/a/29545790/2334614 – nvkokorin

Powiązane problemy