2012-02-10 2 views
1

에 따라 스타일 행이 항상 업데이트되는 것은 아니므로 this one을 읽고 다른 하나는 링크를 찾을 수 없지만 그 중 일부는 보이지 않습니다 해당 솔루션을 보유하고 있습니다.스크롤하는 가상 행 WPF Datagrid

아래 정의 된 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> 

답변

2

그건 가상화의 특징입니다. 설정된 수의 UI 개체 만 실제로 렌더링되고 화면을 스크롤하면 해당 개체 뒤의 DataContext이 변경됩니다.

그래서 귀하의 경우 행이 만들어지고 배경색이 지정됩니다. 스크롤하면 해당 행 뒤에있는 DataContext이 변경되어 데이터 객체가 특정 스크롤 위치에서 색상 A로 지정된 행에 있거나 다른 스크롤 위치에서 색상 B로 지정된 행에있을 수 있습니다.

대체 색상은 어떤 열이 어떤 행에 있는지 식별하는 데 도움이되므로 변경되지 않아도 상관 없습니다. 그러나 행에 대해 일관된 배경색을 유지하려는 경우 데이터 객체에 무언가를 추가하고 해당 속성에서 배경색을 지정합니다. 스크롤하면 DataContext이 변경되어 행 색상도 변경됩니다.

+0

데이터를로드 할 때 생성되는 숨겨진 ID 속성이 있지만 데이터 정렬 및 필터링과 관련된 문제가 발생할 수 있다고 생각했습니다. 어쨌든 빠른 응답 주셔서 감사합니다, 비록 내가 바라는 것이 아니 었더라도! 아무도 더 나은 방법으로 나를 위해 그것을 해결할 수 없다면 (그리고 그것은있을 법하지 않겠지 만), 나는 이것을 수 일 안에 대답으로 받아 들일 것입니다. – Ben