Я столкнулся с этой проблемой, и причина была в том, что моя DataGrid использовала виртуализацию - когда вы прокручиваете выбранный DataGridRow вне экрана, визуальный элемент DataGridRow либо уничтожается, и создается новый, либо - если DataGrid VirtualizingStackPanel.VirtualizationMode
свойство имеет значение Recycling
- оно используется повторно для любой строки, входящей в область просмотра.
Когда происходит любое событие, привязка между вашей ViewModel (с его установленным свойством IsSelectedProperty
) и DataGridRow (с его установленным свойством IsSelected
) нарушается.
Чтобы подтвердить это, попробуйте установить для свойства DataGrid EnableRowVirtualization
значение false.
В моем случае мне потребовалась производительность, необходимая для использования виртуализации, и в итоге я реализовал возможность выбора с использованием Attached Behaviors : в частности, при щелчке строки будет использоваться присоединенное поведение LeftClickCommand для вызова команды делегата в ViewModel, которая устанавливает IsSelectedProperty
. Затем я использовал DataTrigger
, связанный с IsSelectedProperty
в стиле DataGridRow, чтобы выделить строку.
Это решение, по сути, включает в себя собственный механизм выбора, но я нашел единственный способ получить как виртуализацию строк, так и MVVM-дружественный выбор строк.