Проблема с фоном строк в Datagrid WPF

297
14 октября 2017, 16:51

Имеется DataGridPeoples :

<DataGrid x:Name="DataGridPeoples" CanUserDeleteRows="False" Margin="180,10,0,0" Height="718" Width="822" FontSize="15" AutoGenerateColumns="False" ColumnWidth="*" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" CanUserAddRows="False" GridLinesVisibility="All">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Фамилия" Binding="{Binding Family, UpdateSourceTrigger=PropertyChanged}" CanUserResize="False"/>
                <DataGridTextColumn Header="Имя" Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged}" CanUserResize="False"/>
                <DataGridTextColumn Header="Отчество" Binding="{Binding Otch, UpdateSourceTrigger=PropertyChanged}" CanUserResize="False"/>
                <DataGridTextColumn Header="Номер" Binding="{Binding Number, UpdateSourceTrigger=PropertyChanged}" Width="auto" CanUserResize="False"/>
                <DataGridTextColumn Header="Дата рождения" Binding="{Binding BirthDay, UpdateSourceTrigger=PropertyChanged ,StringFormat=d}" Width="auto" CanUserResize="False"/>
                <DataGridTextColumn Header="Дата окончания" Binding="{Binding ExpirationDate, UpdateSourceTrigger=PropertyChanged ,StringFormat=d}" Width="auto" CanUserResize="False"/>
            </DataGrid.Columns>
</DataGrid>

На котором возникает событие:

DataGridPeoples.Loaded += DataGridPeoples_Loaded;

Или

DataGridPeoples.LayoutUpdated

Следующего содержания:

private void DataGridPeoples_Loaded(object sender, EventArgs e)
            {
                foreach (People item in DataGridPeoples.ItemsSource)
                    {
                        var row = DataGridPeoples.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
                        if (row != null && item.ExpirationDate.AddMonths(-1) <= DateTime.Now)
                        {
                            row.Background = Brushes.Crimson;
                        }          
       }
}

Проблема заключается в следующем, при прокрутке формы цвет фона строк применяется к тем строкам к которым не должен применяться, насколько я понял проблема связана с виртуализацией, если сделать на Datagrid:

EnableRowVirtualization="False"

То все работает правильно, но работает очень медленно такой вариант меня не устраивает. Как можно реализовать окраску фона строк и виртуализацию в одном виде?

Answer 1

В общем проблема решена в англоязычной ветке по следующей ссылке: https://stackoverflow.com/questions/17133286/rowvirtualization-cause-incorrect-background-color-for-rows. по умолчанию в Datagrid VirtualizationMode установлен как Recycling. Для решения этой проблемы рекомендуется установить VirtualizationMode в Standard

<DataGrid VirtualizingStackPanel.VirtualizationMode="Standard" />

И изменить события для раскраски фона на DataGrid.LoadingRow

Надеюсь кому-нибудь поможет.

READ ALSO
WPF&amp;MVVM: Привязка свойств VM

WPF&MVVM: Привязка свойств VM

В вопросе Получение данных во ViewModel из делегированного объекта по поводу приведённого ниже кода View с привязками и паттерна MVVM в целом я понял...

242
Асинхронный метод запускает AsyncCallback в текущем потоке

Асинхронный метод запускает AsyncCallback в текущем потоке

Имеется сервер класса TcpListenerОн принимает входящие подключения методом BeginAcceptTcpClient (AsyncCallback, Object)

233
Чтение данных из excel

Чтение данных из excel

Нашёл на просторах StackOverflow пример как читать данные из excelНо вылетают ошибки

190
Аналог Padding в RichTextBox

Аналог Padding в RichTextBox

Когда задан Padding для параграфа, то его формат передается следующей строке, после нажатия EnterИ убрать его получается только вручную

255