从DataGrid到ItemsSource的调用太多

时间:2014-08-07 15:40:39

标签: c# wpf data-binding

我有一个包含wpf toolkit datagrid的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到项目源的调用次数?

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

EnableRowVirtualization="True"

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

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

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

答案 1 :(得分:0)

感谢您的回复。是。我使用.NET 3.5。我已经制作了包含datagrid static的控件,因此一些加载在应用程序启动时结束。但是,当我滚动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”添加到我的风格中。

P.S。有没有办法检查样式是否连接到控件?