将WPF Datagrid虚拟化置于滚动浏览器中时被禁用

时间:2018-09-07 11:30:47

标签: c# wpf performance datagrid scrollviewer

我有一个场景,其中我基本上使用两个数据网格来实现分组,如下所示。为了实现两个网格之间的同步滚动,我使用了scrollviewer。使用滚动查看器将禁用虚拟化,并且将数据网格中的数据加载受到严重影响。下面是我正在使用的示例代码。任何对gr8都有帮助的建议。

                                

                            <Grid Name="Test" Background="White">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>

                                    <DataGrid Name="DataGrid1"  Grid.Column="0" AutoGenerateColumns="False" CanUserResizeRows="False"
              CanUserAddRows="False" BorderBrush="#FF1B1A1A" BorderThickness="0" Background="{x:Null}"  HorizontalGridLinesBrush="DarkGray"
      VerticalGridLinesBrush="DarkGray" SelectionChanged="basketNameDataGrid_SelectionChanged" PreviewMouseWheel="basketNameDataGrid_PreviewMouseWheel">
                                    <DataGrid.CellStyle>
                                        <Style TargetType="DataGridCell">
                                            <Style.Triggers>
                                                <Trigger Property="IsSelected"
                    Value="True">
                                                    <Setter Property="Background"
                    Value="#1E90FF" />
                                                    <Setter Property="Foreground"
                    Value="White" />
                                                </Trigger>
                                            </Style.Triggers>
                                        </Style>
                                    </DataGrid.CellStyle>
                                    <DataGrid.RowStyle>
                                        <Style TargetType="DataGridRow">
                                            <Setter Property="Height" Value="{Binding RowHeight}"></Setter>
                                        </Style>
                                    </DataGrid.RowStyle>
                                    <!--<DataGrid.RowStyle>
                                        <Style TargetType="DataGridRow">
                                            <Setter Property="Height" Value="{Binding RowHeight}"></Setter>
                                        </Style>
                                    </DataGrid.RowStyle>-->
                                    <DataGrid.Columns>
                                        <!--<DataGridTemplateColumn>
                                <DataGridTemplateColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Vertical" >
                                                <Border Margin=".5" >
                                                    <Button Content="Signal" KeyboardNavigation.IsTabStop="False"/>
                                                </Border>
                                                <StackPanel Orientation="Horizontal">
                                                    <Border Margin="0" >
                                                        <Button Margin="0" >
                                                            <TextBlock Text="Name" />
                                                        </Button>
                                                    </Border>
                                                    <Border >
                                                        <Button  KeyboardNavigation.IsTabStop="False" >
                                                            <TextBlock MinWidth="90" MinHeight="27" Text="Description" Margin="10,10,0,0" />
                                                        </Button>
                                                    </Border>
                                            </StackPanel>

                                        </StackPanel>
                                    </DataTemplate>
                                </DataGridTemplateColumn.HeaderTemplate>
                                </DataGridTemplateColumn>-->
                                        <DataGridTemplateColumn Header="Object Reference" >
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding ObjRef}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <DataGridTemplateColumn Header="by ICD">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding ByICD}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <DataGridTemplateColumn Header="by Standard" >
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding ByStandard}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                    </DataGrid.Columns>
                                </DataGrid>
                                    <DataGrid Name="DataGrid2" Grid.Column="1" HeadersVisibility="Column" 
              CanUserResizeRows="False" CanUserAddRows="False" Margin="0" BorderBrush="{x:Null}" BorderThickness="0" Background="{x:Null}"
                                           HorizontalGridLinesBrush="DarkGray" VerticalGridLinesBrush="DarkGray" SelectionChanged="itemDataGrid_SelectionChanged" PreviewMouseWheel="itemDataGrid_PreviewMouseWheel">
                                    <DataGrid.CellStyle>
                                        <Style TargetType="DataGridCell">
                                            <Style.Triggers>
                                                <Trigger Property="IsSelected"
                    Value="True">
                                                    <Setter Property="Background"
                    Value="#1E90FF" />
                                                    <Setter Property="Foreground"
                    Value="White" />
                                                </Trigger>
                                            </Style.Triggers>
                                        </Style>
                                    </DataGrid.CellStyle>
                                    <DataGrid.RowStyle>
                                        <Style TargetType="DataGridRow">
                                            <Setter Property="Height" Value="20"></Setter>
                                        </Style>
                                    </DataGrid.RowStyle>
                                    <DataGrid.Columns>
                                        <DataGridTemplateColumn Header="Attribute" Width="Auto">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Attribute, Mode = OneWay}" HorizontalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <DataGridTemplateColumn Header="Type" Width="Auto">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Type, Mode = OneWay}" HorizontalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <DataGridTemplateColumn Header="FC" Width="Auto">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding FC, Mode = OneWay}" HorizontalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <DataGridTemplateColumn Header="Default" Width="Auto">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding DefaultVal, Mode = OneWay}" HorizontalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>

                                        <DataGridTemplateColumn Header="Table Type" Width="Auto">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding TableType, Mode = OneWay}" HorizontalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <DataGridTemplateColumn Header="Signal Name" Width="Auto">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Name, Mode = OneWay}" HorizontalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <DataGridTemplateColumn Header="Signal Description" Width="Auto">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Desription, Mode = OneWay}" HorizontalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <!--<DataGridTemplateColumn>
                                    <DataGridTemplateColumn.HeaderTemplate>
                                        <DataTemplate>
                                            <ItemsControl Height="36" Width="175">-->
                                        <!--ItemsSource="{Binding DataContext.ScenarioHeaders, ElementName=LayoutRoot}">-->
                                        <!--
                                                <ItemsControl.ItemsPanel>
                                                    <ItemsPanelTemplate>
                                                        <StackPanel Orientation="Horizontal" />
                                                    </ItemsPanelTemplate>
                                                </ItemsControl.ItemsPanel>
                                                <ItemsControl.ItemTemplate>
                                                    <DataTemplate>
                                                        <StackPanel Orientation="Vertical">
                                                            <Border  Width="150" >
                                                                <TextBlock Text="Description" TextAlignment="Center"/>
                                                            </Border>
                                                            <StackPanel Orientation="Horizontal">
                                                                <Border  Width="50" >
                                                                    <TextBlock Text="Signal2" TextAlignment="Center">

                                                                    </TextBlock>
                                                                </Border>
                                                                <Border  Width="50" >
                                                                    <TextBlock Text="Signal1" TextAlignment="Center"/>
                                                                </Border>
                                                            </StackPanel>
                                                        </StackPanel>
                                                    </DataTemplate>
                                                </ItemsControl.ItemTemplate>
                                            </ItemsControl>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.HeaderTemplate>
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <ItemsControl ItemsSource="{Binding ClassSegments}">
                                                <ItemsControl.ItemsPanel>
                                                    <ItemsPanelTemplate>
                                                        <StackPanel Orientation="Horizontal"/>
                                                    </ItemsPanelTemplate>
                                                </ItemsControl.ItemsPanel>
                                                <ItemsControl.ItemTemplate>
                                                    <DataTemplate>
                                                        <StackPanel Orientation="Horizontal">
                                                            <Border  Width="50" >
                                                                <TextBlock/>
                                                                -->
                                        <!--Text="{Binding RegularStudentCount}" TextAlignment="Center"/>-->
                                        <!--
                                                            </Border>
                                                            <Border  Width="50" >
                                                                <TextBlock></TextBlock> -->
                                        <!--Text="{Binding EIPStudentCount}" TextAlignment="Center"/>-->
                                        <!--
                                                            </Border>
                                                        </StackPanel>
                                                    </DataTemplate>
                                                </ItemsControl.ItemTemplate>
                                            </ItemsControl>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>-->
                                        <DataGridCheckBoxColumn Header="Inverse" Width="Auto" Binding="{Binding Inverse, Mode = TwoWay}" >
                                            <!--<DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding Inverse, Mode = OneWay}"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>-->
                                        </DataGridCheckBoxColumn>
                                        <DataGridTemplateColumn Header="Period(ssp)" Width="Auto">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding period, Mode = OneWay}" HorizontalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <DataGridTemplateColumn Header="Timing" Width="Auto">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Timing, Mode = OneWay}" HorizontalAlignment="Center"/>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>

                        </ScrollViewer>
                        </Grid> 

Sample image of two merged datagrids

Scroll Viewer正在禁用虚拟化。我需要在数据网格的某些列中合并单元格。请让我知道在不丢失虚拟化的情况下实现该目标的任何替代解决方案。

2 个答案:

答案 0 :(得分:0)

如果可以给我一个工作示例,效果会更好,但是无论如何,使用ScrollViewer作为DataGrid的父级并不是一个好主意,我认为最好重写DataGrid并为scrollValue设置依赖项,您应该具有独立的滚动条,并将两个DataGrid的此依赖项属性绑定到此滚动条值,这样,您可以在更改滚动条值的同时通过代码向后滚动两个DataGrid,并且虚拟化应该可以工作。

嗨。我已经在github中添加了代码,请下载并尝试https://github.com/Ilya-Grigoryan/SynchDataGridScroll.git

答案 1 :(得分:0)

虚拟化仅在网格尺寸受限的情况下有效。

如果将DataGrid放置在ScrollViewer或StackPanel内,或者任何未将修复约束传递给DataGrid的控件,它将破坏DataGrid中的虚拟化。