我们有一个3层架构(UI,BL,DAL)WPF应用程序。我需要处理大量行的WPF和DevExpress数据网格的加载。 BL方法将返回一个可观察的对象集合,这些对象将绑定到WPF数据网格。如果记录的数量很大,则UI变得无响应。因此,我们需要实现一个解决方案,以便在BL方法执行查询并处理数据时显示已完成工作百分比的进度条。在这里,我需要在执行查询时立即获取记录总数,并在处理完每行之后需要显示标签中项目处理的当前索引,如“处理1/2000文档”。
实现上述功能的最佳方法是什么。我们正在使用MVVM模式。我是否需要改变我们提取和处理BL中的记录的方式(目前是BL方法中的fectch和处理(从datareader到自定义对象的Map值))。或者,我正在寻找在用户滚动数据网格时以分页方式加载数据网格中的行。
赞赏任何样品链接。
编辑: @Big Daddy你的解决方案 1)添加新属性以查看模型以获取TotalCount和PercentComplete。 2)将viewmodel传递给Search方法。 3)使用BGW更新属性。
上述似乎是一个可行的解决方案。但我很想知道是否有任何其他解决方法,而不依赖于viewmodel。任何设计模式都可以用于这种操作吗?
答案 0 :(得分:2)
您可以使用BackgroundWorker来处理此问题。它不会在获取数据时阻止UI,并会保持UI对用户的响应。 BackgroundWorker有一个ProgressChanged事件,可以很好地与ProgressBars一起使用。
在我参与的项目中,我在客户端服务/存储库中实现了BW。您的视图模型可以调用此类。这里的方法将实例化BW,完成工作,报告进度并返回数据。您需要在UI上报告progess,因此在视图模型中设置属性并将ProgressBar的值绑定到它,如下所示:
查看-模型强>
private int _percentCompleted;
[DefaultValue(0)]
public int PercentCompleted
{
get { return _percentCompleted; }
set
{
_percentCompleted = value;
RaisePropertyChanged(() => this.PercentCompleted);
}
}
查看强>
<ProgressBar x:Name="SourceBatchUploadProgressBar"
Style="{StaticResource GreenProgressBar}" Grid.Column="1" Grid.Row="1"
Value="{Binding PercentCompleted, UpdateSourceTrigger=PropertyChanged}"
Height="25" Width="200" Margin="5,0,10,5"/>
您需要让BW的ReportProgress事件更新PercentCompleted属性才能使其生效。像这样:
BackgroundWorker.RunWorkerCompleted += (o, e) =>
{
...Update progress
};
如果您想了解更多详情,请与我们联系。
答案 1 :(得分:1)
所以你拥有所有的行。你指的是什么处理?渲染?渲染的显示状态始终为100%,因为在渲染完成之前它不会渲染。
UI需要很长时间来渲染2000行。正在进行大量的格式化和大小调整。
将UI拆分为每页显示40行,包含下一页和上一页按钮。
如果DevExpress数据网格不支持虚拟化,那么寻找一个可行的网格。对于速度我喜欢ListView GridView。
哇,检查一下。你在听我给你更多。因此,如果速度很快,您可以立即获取整个ID列表(并且可以获得总计数)。然后根据需要创建40个对象。如果你想在BackGroundWorker上创建下一个40。启动BackGroundWorker时禁用“下一步”按钮,并在“完成”中启用它。