Ответ 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-дружественный выбор строк.