2013-02-17 21 views
13

mam w moim modelu (klasa X) właściwości Boolean: IsSelected, jest połączony z WPF DataGrid następująco:IsSelected Wiązanie w WPF DataGrid

<DataGrid SelectedIndex="{Binding SelectedXIndex,Mode=TwoWay}" 
      DataContext="{Binding MyViewModel}" 
      ItemsSource="{Binding ListX}" AutoGenerateColumns="False"> 
    <DataGrid.RowStyle> 
     <Style TargetType="{x:Type DataGridRow}"> 
      <Setter Property="IsSelected" 
        Value="{Binding IsSelected, Mode=TwoWay, 
          UpdateSourceTrigger=PropertyChanged}"/> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 

ListX - ObservableCollection

IsSelecte - Zaproszenie do NotifyPropertyChange

Działa świetnie.

Ale kiedy mam dużo wierszy, które muszę przewijać, aby je zobaczyć, i naciskam przycisk "Wybierz wszystko", który uruchamia następującą funkcję, wybiera tylko kilka wierszy, a nie wszystkie: (mimo wszystko IsSelected na liście jest prawda)

public void SelectAll() 
{ 
    ListX.All(c => c.IsSelected = true); 
} 

nie mogę zrozumieć, dlaczego tak się dzieje?

+0

Widziałeś [to pytanie] (http://stackoverflow.com/q/2068130/620360) z Powiązana sekcja? – LPL

+0

@LPL To mi nie pomogło, odpowiedzi tam nie powiodły się. I mówię o danych zwrotnych od viewModel do XMAL i to pytanie jest odwrotne. –

Odpowiedz

12

to co pomogło mi w końcu:

umieścić w DataGrid:

VirtualizingStackPanel.VirtualizationMode="Standard" 
+1

Jeśli potrzebujesz użyć trybu recyklingu (ja), inną opcją jest dołączone zachowanie/codebehind, które monitoruje zdarzenie OnSelectedCellsChanged siatki i reaguje przez aktualizację wybrane (de) wybrane VM, jak wskazano (będą również musiały wykonać odwrotność, jeśli pożądane jest wiązanie dwukierunkowe). – dlf