триггеры стиля для чередующихся строк не всегда обновляются при прокрутке виртуализированной таблицы данных WPF - PullRequest
1 голос
/ 10 февраля 2012

Есть несколько вопросов, подобных этому на SO, я прочитал этот , а другой я не могу найти ссылку, но ни у одного из них нет решения, которое применимо.

У меня есть DataGrid, определенный ниже, и он имеет различные стили, запускаемые на AlternationIndex, равном 0 или 1. Когда я прокручиваю вверх, иногда данная ячейка переворачивается от одного цвета к другому.

Знаете ли вы какой-нибудь способ предотвратить это без отключения виртуализации?

(Я взял определения столбцов для экономии места, я не думаю, что они важны для этого. Все DataTriggers-всегда работают, это просто чередование, с которым у меня возникают проблемы.)

<DataGrid 
        ItemsSource="{Binding Path=LogItems, Mode=OneWay}" 
        Grid.Row="1" 
        AlternationCount="2"
        Name="logDataGrid"
        VirtualizingStackPanel.IsVirtualizing="True"
        VirtualizingStackPanel.VirtualizationMode="Recycling">
        <DataGrid.Resources>
            <local:IsEntryExceptionConverter x:Key="isEntryExceptionConverter" />
            <Style TargetType="{x:Type DataGridCell}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridCell}">
                            <Border Name="DataGridCellBorder">
                                <ContentControl Content="{TemplateBinding Content}">
                                    <ContentControl.ContentTemplate>
                                        <DataTemplate>
                                            <TextBlock Background="Transparent" TextWrapping="WrapWithOverflow" TextTrimming="CharacterEllipsis" 
                                            Height="auto" Width="auto" Text="{Binding Text}"/>
                                        </DataTemplate>
                                    </ContentControl.ContentTemplate>
                                </ContentControl>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <Trigger Property="DataGridCell.IsSelected" Value="True">
                        <Setter Property="TextBlock.Foreground" Value="Blue" />
                    </Trigger>
                </Style.Triggers>
            </Style>
            <SolidColorBrush x:Key="ExceptionBrush" Color="OrangeRed" Opacity="0.5"/>
            <SolidColorBrush x:Key="ErrorBrush" Color="Red" Opacity="0.5"/>
            <SolidColorBrush x:Key="WarningBrush" Color="Orange" Opacity="0.5"/>
            <SolidColorBrush x:Key="AlternatingRowBackground0" Color="AliceBlue" Opacity="0.5" />
            <SolidColorBrush x:Key="AlternatingRowBackground1" Color="LightBlue" Opacity="0.5" />
        </DataGrid.Resources>

        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <Trigger Property="AlternationIndex" Value="0">
                        <Setter Property="Background" Value="{StaticResource AlternatingRowBackground0}" />
                    </Trigger>
                    <Trigger Property="AlternationIndex" Value="1">
                        <Setter Property="Background" Value="{StaticResource AlternatingRowBackground1}" />
                    </Trigger>
                    <DataTrigger Binding="{Binding Path=Level}" Value="Warning">
                        <Setter Property="Background" Value="{StaticResource WarningBrush}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=Message, Converter={StaticResource isEntryExceptionConverter}}" Value="True">
                        <Setter Property="Background" Value="{StaticResource ExceptionBrush}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=Level}" Value="Error">
                        <Setter Property="Background" Value="{StaticResource ErrorBrush}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
    </DataGrid>

1 Ответ

2 голосов
/ 10 февраля 2012

Такова природа виртуализации. Фактически отображается только установленное количество объектов пользовательского интерфейса, и при прокрутке вы меняете DataContext за этими объектами.

Итак, в вашем случае строки создаются и получают цвет фона. При прокрутке изменяется DataContext за этими строками, поэтому объект данных может находиться в строке, которой был присвоен цвет A в определенной позиции прокрутки, или в строке, которой был назначен цвет B в другой позиции прокрутки.

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

...