Подтвердить что ты не робот

Datagrid.IsSelected Переплет и прокрутка

Я использую MVVM и привязываю datagrid к коллекции с помощью некоторого кода:

<DataGrid ItemsSource="{Binding Entites}" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True" 
                  SelectedItem="{Binding SelectedEntity}">

И я также использую привязку к IsSelectedProperty с помощью стиля (RowStyle или ItemContainerStyle)

<DataGrid.RowStyle>
        <Style>
              <Setter Property="DataGridRow.IsSelected" Value="{Binding IsSelectedProperty, Mode=TwoWay}" />                        
        </Style>
</DataGrid.RowStyle>

Это хорошо работает. Но если я прокручиваю datagrid вниз и вверх, он перестает работать.

4b9b3361

Ответ 1

Я столкнулся с этой проблемой, и причина в том, что моя DataGrid использовала виртуализацию - когда вы прокручиваете выбранный DataGridRow с экрана, визуальный элемент DataGridRow либо уничтожается, либо создается новый, либо - если DataGrid VirtualizingStackPanel.VirtualizationMode свойство имеет значение Recycling - он используется повторно для любой строки, входящей в область просмотра.

При возникновении любого события связь между вашим ViewModel (с его набором свойств IsSelectedProperty) и DataGridRow (с его набором свойств IsSelected) нарушена.

Чтобы убедиться в этом, попробуйте установить для свойства DataGrid EnableRowVirtualization значение false.

В моем случае мне нужна была производительность, требуемая при использовании виртуализации, и в итоге реализовала возможность выбора с помощью Attached Behaviors: в частности, нажмите на row будет использовать прикрепленное поведение LeftClickCommand для вызова команды делегата в ViewModel, которая устанавливает IsSelectedProperty. Затем я использовал DataTrigger, привязанный к IsSelectedProperty в стиле DataGridRow, чтобы выделить строку.

Это решение, по сути, включает в себя запуск вашего собственного механизма выбора, но это был единственный способ получить виртуализацию строк и MVVM-дружественный выбор строк.

Ответ 2

Попробуйте установить для виртуализатора стандарт на DataGrid: VirtualizingStackPanel.VirtualizationMode="Standard".

Я считаю, что виртуализация включена по умолчанию, но режим перерабатывается. Поэтому свойство IsSelected по какой-либо причине не переоценивается при создании новой строки в прокрутке.

Ответ 3

Есть ли конкретная причина, по которой вы привязываетесь в RowStyle? Я всегда привязывал свой SelectedItem непосредственно к свойству SelectedEntity в моей ViewModel.