ami*_*ard 2 wpf virtualization xaml datagrid xbap
我有一个WPF应用程序,在某些页面中有一个Datagrid.这个数据网格需要一次加载5000行(分页对我来说不是一个选项),这需要很长时间.我设置EnableRowVirtualization = True并且现在可以接受性能,但这里存在问题.在我的数据网格中,我需要根据列值(比如STATUS)将不同的背景颜色设置为不同的行,将EnableRowVirtualization从False更改为True,在滚动时导致错误的着色.
- - 编辑 - -
这是我的XAML代码:
<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>
Run Code Online (Sandbox Code Playgroud)
以下代码执行绑定:
注意:我的所有列都是动态生成的,具体取决于请求加载的对象:
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;
}
Run Code Online (Sandbox Code Playgroud)
返回的DataGridColumn将添加到我的DataGrid列.
是否可以同时使用RowVirtualization和着色?
谢谢.
这对你来说可能有点太晚,因为你显然找到了适合你的解决方案,但希望它可以帮助别人.我刚才遇到了类似的问题,经过一些谷歌搜索后发现,这种行为的原因是VirtualizationMode的默认值是Recycling
.这意味着项目容器被重复使用,因此即使滚动后占据容器的项目不应该着色,背景的颜色也会粘住.
要解决此问题,只需设置VirtualizationMode
为Standard
,如下所示:
<DataGrid VirtualizingStackPanel.VirtualizationMode="Standard" />
Run Code Online (Sandbox Code Playgroud)
当您滚动,应用您在LoadingRow
事件中执行的任何更改时,将重新创建和销毁容器.
归档时间: |
|
查看次数: |
2400 次 |
最近记录: |