【问题标题】:Too many calls from DataGrid to ItemsSource从 DataGrid 到 ItemsSource 的调用过多
【发布时间】:2014-08-07 15:40:38
【问题描述】:

我有一个 WPF 应用程序,其中包含 wpf 工具包数据网格。

这是 DataGrid 控件的 XAML 代码

<wpf_toolkit:DataGrid ItemsSource="{Binding Plans, Mode=OneTime}" Grid.Row="0" x:Name="PlanDataGrid" ColumnWidth="auto"  HorizontalScrollBarVisibility="Auto">
     <wpf_toolkit:DataGrid.Columns>
        <wpf_toolkit:DataGridTextColumn Header="Key Note Name" IsReadOnly="True"
                       Binding="{Binding Path=KeyNotepad, Mode=OneTime}" />
        <wpf_toolkit:DataGridTextColumn Header="SKO Name" IsReadOnly="True"
                       Binding="{Binding Path=SKOName, Mode=OneTime}" />
        <wpf_toolkit:DataGridTextColumn Header="SKO Version" IsReadOnly="True"
                       Binding="{Binding Path=SKOVer, Mode=OneTime}" />
                      <-- Other 10 columns with data templates, bindings etc. -->
     </wpf_toolkit:DataGrid.Columns>
 </wpf_toolkit:DataGrid>

DataGrid 的ItemsSource 属性绑定到简单的基于字符串的视图模型的集合。

所以,问题在于 DataGrid 从项目源 columns_count * visible_rows_count 次(大约 27*13 次)中获取数据,这导致了可怕的应用程序制动。

有什么方法可以减少从 DataGrid 到项目源的调用次数?

提前致谢。

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

    我看到的问题是未启用行虚拟化。这会导致 DataGrid 为 ItemsSource 中的所有项目创建可视元素,而不仅仅是那些可见的。 要启用虚拟化,您需要在 DataGrid 上设置此属性

    EnableRowVirtualization="True"
    

    为了安全起见,您需要从 VirtualizingStackPanel 设置附加属性

    VirtualizingStackPanel.IsVirtualizing="True"
    VirtualizingStackPanel.VirtualizationMode="Recycling"
    

    VirtualizationMode 将导致 DataGrid 重用可视行,而不是在每次滚动时生成新行。虽然我不确定这对您是否可用,因为您似乎正在使用 WpfToolkit。您的目标是 .NET 3.5 吗?

    【讨论】:

      【解决方案2】:

      感谢您的回复。是的。我使用 .NET 3.5。我已经控制了包含静态数据网格的内容,因此一些负载在应用程序启动时结束。但是,当我滚动 DataGrid 时,它会加载数据,但不像第一次那样加载。关于虚拟化的一些话。绑定到 DataGrid 的数据源就像数据虚拟化容器一样工作。

      这里是链接http://www.codeproject.com/Articles/34405/WPF-Data-Virtualization。 我的数据源是 similas。此外,我为网格创建样式,启用虚拟化并链接到数据网格(我忘了在此处的代码示例中编写它)。但没有任何改变。这是我的风格以及我如何将其链接到 DataGrid

      <Style x:Key="vd_datagrid_style" BasedOn="{StaticResource {x:Type wpf_toolkit:DataGrid}}"
             TargetType="{x:Type wpf_toolkit:DataGrid}">
          <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
          <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
          <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="True"/>
      </Style>
      
      <wpf_toolkit:DataGrid ItemsSource="{Binding Plans, Mode=OneTime}" Grid.Row="0" x:Name="PlanDataGrid"
                                        Style="{StaticResource vd_datagrid_style}" SelectedItem="{Binding SelectedPlan, Mode=TwoWay}">
      

      嗯...我会尝试将 EnableRowVirtualization="True" 添加到我的样式中。

      附:有没有办法检查样式是否连接到控件?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 2012-02-12
        • 2011-04-22
        • 2023-03-08
        • 2014-10-05
        • 1970-01-01
        • 2015-11-22
        相关资源
        最近更新 更多