C# 从DataGrid到ItemsSource的调用过多

C# 从DataGrid到ItemsSource的调用过多,c#,wpf,data-binding,C#,Wpf,Data Binding,我有一个包含WPF工具包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.Colum

我有一个包含WPF工具包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从items源列中获取数据的次数大约是应用程序错误次数的27*13倍

有没有办法减少从DataGrid到源项的调用数量


提前感谢。

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

EnableRowVirtualization="True"
为了安全起见,您需要从VirtualzingStackPanel设置附加属性

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

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

谢谢您的回复。对我使用.NET3.5。我已经将包含datagrid的控件设置为静态,因此一些加载在应用程序启动时结束。但是,当我滚动DataGrid时,它会加载数据,但不像第一次加载那么多。关于虚拟化的几句话。绑定到DataGrid的数据源的工作方式类似于数据虚拟化容器

这里是链接。 我的数据源是similas。此外,我还为网格创建了一种样式,它支持虚拟化并链接到datagrid,我忘了在这里的代码示例中编写它。但一切都没有改变。以下是我的风格以及我如何将其链接到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

还有,有没有办法检查样式是否连接到控件