Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF Datagrid内部具有虚拟化功能的扩展器_Wpf_Performance_Xaml_Wpfdatagrid_Virtualization - Fatal编程技术网

WPF Datagrid内部具有虚拟化功能的扩展器

WPF Datagrid内部具有虚拟化功能的扩展器,wpf,performance,xaml,wpfdatagrid,virtualization,Wpf,Performance,Xaml,Wpfdatagrid,Virtualization,我正在开发的原型中存在性能问题。需求是建立一个具有多个同步冻结窗格的数据网格,支持分组和排序等。。。有关我正在构建的网格的更多详细信息,请参见 现在,我有一个关于分组的问题,特别是扩展器。我有一个由以下Xaml定义的GroupStyle,它取自 扩展器没有虚拟化,当一个组中有几百行时,我们会遇到性能问题 以前有没有人遇到过这样的问题,并有过解决办法?我正在寻找一个理想的虚拟化扩展器,并且已经看到(这并不能解决问题) 如果您使用的是.NET 4,则根据IsExpanded状态,获取ItemsP

我正在开发的原型中存在性能问题。需求是建立一个具有多个同步冻结窗格的数据网格,支持分组和排序等。。。有关我正在构建的网格的更多详细信息,请参见

现在,我有一个关于分组的问题,特别是扩展器。我有一个由以下Xaml定义的GroupStyle,它取自


扩展器没有虚拟化,当一个组中有几百行时,我们会遇到性能问题


以前有没有人遇到过这样的问题,并有过解决办法?我正在寻找一个理想的虚拟化扩展器,并且已经看到(这并不能解决问题)

如果您使用的是.NET 4,则根据IsExpanded状态,获取
ItemsPresenter
s可见性以跟踪/依赖IsExpanded状态

在.NET4.5中,有一个新的附加属性
VirtualizingPanel.isvirtualizingwengroup

另一种选择是将分组推送到ViewModel中,而不是让DataGrid/CollectionView负责。请看这里:


    • 为了解决这个问题,我们做了以下工作

      我们使用DataTemplates为不同的行视图模型提供不同的行视图。我们有一个GroupRowViewModel和ItemRowViewModel。还有一个父视图模型,它具有组/项目视图模型的排序列表

      实例化网格时,父视图模型会将所有子视图模型排序为以下几类:

      • 团体
        • 项目
        • 项目
        • 项目
      • 团体
        • 项目
        • 项目
        • 项目
      单击GroupRow时,您希望执行一些代码,其中父级(包含组+项目行的排序列表)将删除或包含项目。例如,假设第二次单击gropu,您绑定到的rowviewmodels列表现在变为

      • 团体
        • 项目
        • 项目
        • 项目
      • 组(已折叠)
      就这样。因此,完全没有魔法,您可以根据单击的内容手动删除或包含所需的行。它以可接受的速度与虚拟化和数十万行协同工作


      对不起,我不能发布任何代码(由于保密协议),但我希望这能帮助你。此外-我建议查看Telerik Grid,因为它对于大型数据集来说速度非常快

      这种配置的性能可能会非常慢,在连接了调试器的情况下运行调试版本,但在没有连接调试器的情况下合理地运行发布版本。你试过发布版本吗?嗨,道格,好主意,我会检查的。从我在web上的搜索结果来看,分组时WPF Datagrid似乎无法虚拟化,因为VirtualzingStackPanel包含的组很少,每个组在非虚拟化项目中都有许多行。我很遗憾,没有人能回答这个问题。无法覆盖DataGridRowsPresenter或使用其他面板吗?它能工作吗?嗨,约翰,我面前没有代码,所以不能发布完整的解决方案,但是我成功地使它工作了。它几乎涉及到对行模板的重写。所以我们有“分组”行和“项目”行。然后单击组行将从其集合视图源中删除子项行。所有这些都是在代码中完成的,速度非常快,有成千上万行。您丢失的是展开/折叠上的漂亮Swoosh动画这是一个了不起的消息,当您拥有代码时,您将能够在codeproject或其他网站上共享甚至发布它。谢谢,但我和其他许多人一样,仍然在寻找.NET 4中的解决方案=(性能很差,有1000、2000个项目被分成几个组。特别是当它打开一个扩展器时。看看这个例子……它将分组推到ViewModel中,而不是DataGrid/CollectionView中。感谢共享,在特定情况下听起来是一个很好的选择,唯一的问题是生成更大的工作…@J。).列侬科林在上面的博客文章链接与我们使用的解决方案非常相似。我当时甚至读过这篇文章。我担心这是唯一的方法
          <!--Default GroupStyle-->
          <GroupStyle x:Key="gs_Default">
              <GroupStyle.Panel>
                  <ItemsPanelTemplate>
                      <DataGridRowsPresenter/>
                  </ItemsPanelTemplate>
              </GroupStyle.Panel>
              <GroupStyle.HeaderTemplate>
                  <DataTemplate>
                      <StackPanel>
                          <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Padding="3"/>
                      </StackPanel>
                  </DataTemplate>
              </GroupStyle.HeaderTemplate>
              <GroupStyle.ContainerStyle>
                  <Style TargetType="{x:Type GroupItem}">
                      <Setter Property="Template">
                          <Setter.Value>
                              <ControlTemplate TargetType="{x:Type GroupItem}">
                                  <Expander x:Name="exp"
                                            BorderBrush="#FFA4B97F" 
                                            BorderThickness="0,0,0,1" 
                                            IsExpanded="{Binding Path=Items[0].IsExpanded}">
                                      <Expander.Header>
                                          <DockPanel TextBlock.FontWeight="Bold">
                                              <TextBlock Text="{Binding Path=Name}" Margin="5,0,5,0" />
                                              <TextBlock Text="{Binding Path=ItemCount}"/>
                                          </DockPanel>
                                      </Expander.Header>
                                      <ItemsPresenter/>                       
                                  </Expander>
                              </ControlTemplate>
                          </Setter.Value>
                      </Setter>
                  </Style>
              </GroupStyle.ContainerStyle>
          </GroupStyle>