将WPF Datagrid虚拟化置于滚动查看器中时被禁用 [英] WPF Datagrid virtualization getting disabled when placed in a scrollviewer

查看:83
本文介绍了将WPF Datagrid虚拟化置于滚动查看器中时被禁用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a scenario where in I am using two datagrids basically to achieve grouping as shown below. For achieving synchronized scrolling between two grids I am using a scrollviewer. Using scroll viewer is disabling the virtualization and loading data in datagrids is getting affected drastically. below is the sample code I am using. Any suggestions whould be of gr8 help.

                            <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> 

两个合并的数据网格的示例图像

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

Scroll viewer is disabling virtualization. I need to have merged cells in some columns of my datagrid. Please let me know of any alternate solution to achieve the same without losing virtualization.

推荐答案

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

it will be better if you can give me a little working example, but anyway using ScrollViewer as parent of DataGrid is not a good idea, I think it will be better to override DataGrid and have dependency property for scrollValue, and you should have independent scrollbar and bind this dependency property for both DataGrid to this scrollbar value, in this way you can scroll both DataGrids via code behind while scrollbar value changed, and you virtualization should work.

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

Hi. I have added code in github, please download it and try https://github.com/Ilya-Grigoryan/SynchDataGridScroll.git

这篇关于将WPF Datagrid虚拟化置于滚动查看器中时被禁用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆