WPF 애플리케이션이 있고 일부 페이지에 Datagrid가 있습니다. 이 DataGrid는 한 번에 5000 개의 행을로드해야합니다 (페이지 매김은 나를위한 옵션이 아닙니다) 이것은 오래 걸립니다. EnableRowVirtualization = True로 설정하면 성능이 만족 스럽지만 여기에는 문제가 있습니다. 내 데이터 격자에서 열 값 (STATUS)에 따라 다른 행에 다른 배경색을 설정해야하며 EnableRowVirtualization을 False에서 True로 변경하면 스크롤 할 때 색이 잘못 표시됩니다.RowVirtualization으로 인해 행의 배경색이 올바르지 않습니다.
참고 :
<my:DataGrid Name="dgDataGrid" DockPanel.Dock="Top" AutoGenerateColumns="False" ClipboardCopyMode="ExcludeHeader"
CanUserDeleteRows="True" RowHeight="20" SelectionMode="Extended" SelectionUnit="FullRow" FontFamily="Tahoma"
ItemsSource="{Binding}" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.IsVirtualizing="True"
EnableRowVirtualization="True" EnableColumnVirtualization="False" IsSynchronizedWithCurrentItem="True" BorderBrush="Blue"
RowBackground="White" HorizontalGridLinesBrush="Blue" GridLinesVisibility="Horizontal" VerticalGridLinesBrush="Blue"
IsTextSearchEnabled="False" IsTabStop="True" HeadersVisibility="All" Loaded="dgDataGrid_Loaded"
ContextMenuOpening="dgDataGrid_ContextMenuOpening" LoadingRow="dgDataGrid_LoadingRow"
ScrollViewer.IsDeferredScrollingEnabled ="True">
<my:DataGrid.Resources>
</my:DataGrid.Resources>
<my:DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type my:DataGridRow}}, Path=Header}"></TextBlock>
</DataTemplate>
</my:DataGrid.RowHeaderTemplate>
<my:DataGrid.ColumnHeaderStyle>
<Style TargetType="my:DataGridColumnHeader">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding}" Foreground="Blue"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</my:DataGrid.ColumnHeaderStyle>
<my:DataGrid.ContextMenu>
<ContextMenu Name="cmDataGrid" StaysOpen="True">
<MenuItem Name="mnuView" Header="نمایش">
<MenuItem Name="mnuHideColumn" Header="Hide Column" Click="mnuHideColumn_Click"/>
<MenuItem Name="mnuShowColumn" Header="Show Column"/>
<Separator/>
<MenuItem Name="mnuGroupByColumn"
Header="Group by this column" Click="mnuGroupColumn_Click" />
<MenuItem Name="mnuClearGroups"
Header="Clear grouping" Click="mnuGroupColumn_Click" />
<Separator/>
<MenuItem Header="Header Alignment">
<MenuItem Name="mnuHeaderCenter" Header="Center"/>
<MenuItem Name="mnuHeaderLeft" Header="Left"/>
<MenuItem Name="mnuHeaderRight" Header="Right"/>
</MenuItem>
<MenuItem Header="Content Alignment">
<MenuItem Name="mnuContentCenter" Header="Center"/>
<MenuItem Name="mnuContentLeft" Header="Left"/>
<MenuItem Name="mnuContentRight" Header="Right"/>
</MenuItem>
</MenuItem>
</ContextMenu>
</my:DataGrid.ContextMenu>
</my:DataGrid>
하고 다음 코드는 바인딩을 수행
는 ---- ---- 여기
내 XAML 코드 편집 모든 내 열에서 생성 얻고있다 플라이는로드가 요청 된 객체에 따라 달라집니다.public static DataGridColumn CreateTextBoxWithBackgroudColumn(DataColumn dataCol, string columnName)
{
DataGridTemplateColumn dgtc = new DataGridTemplateColumn();
dgtc.Header = columnName;
dgtc.HeaderStyle = (Style)(App.Current as App).FindResource("ColumnHeaderStyle");
FrameworkElementFactory cellTemplateFactory = new FrameworkElementFactory(typeof(TextBlock));
Binding dataBinding = new Binding(dataCol.ColumnName);
dataBinding.Mode = BindingMode.TwoWay;
dataBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
dataBinding.Converter = new BackGroundConverter();
cellTemplateFactory.SetBinding(TextBlock.BackgroundProperty, dataBinding);
DataTemplate cellTemplate = new DataTemplate();
cellTemplate.VisualTree = cellTemplateFactory;
cellTemplate.Seal();
dgtc.CellTemplate = cellTemplate;
return dgtc;
}
반환되는 DataGridColumn은 b e가 내 DataGrid 열에 추가되었습니다.
RowVirtualization과 컬러링을 동시에 사용할 수 있습니까?
감사합니다.
스눕을 사용해 보셨나요? 그렇지 않으면 게시물 코드 샘플이 틀림 무엇을 추측하기가 정말로 어렵습니다. – makc
요점은 RowVirtualization이 새로운 표시 페이지를 생성하지 않으며, 필드의 다음 페이지를 가져 와서 이전 페이지 프레임에 넣는 식으로 계속합니다. 따라서 몇 번 아래로 스크롤하면 모든 행 색상 바인딩이 일치하지 않습니다. 비활성화하면 문제가 해결되지만 성능은 크게 떨어집니다! 확신 할 수없는 점은이 문제를 해결하고 동시에 두 가지를 모두 갖기위한 트릭이 있다는 것입니까? –
어떤 바인딩 불일치도 있어서는 안됩니다. 관련 코드 – makc