Датагрид.Выбранная привязка и прокрутка - PullRequest
13 голосов
/ 21 июня 2011

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

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

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

Ответы [ 3 ]

17 голосов
/ 22 июня 2011

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

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

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

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

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

8 голосов
/ 20 марта 2012

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

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

1 голос
/ 22 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...