1

我们有一个 3 层架构(UI、BL、DAL)的 WPF 应用程序。我需要处理加载大量行的 WPF 和 DevExpress 数据网格。BL 方法将返回要绑定到 WPF 数据网格的可观察对象集合。如果记录的数量非常大,那么 UI 将变得无响应。因此,我们需要实现一个解决方案,以便在 BL 方法执行查询和处理数据时显示一个进度条,其中包含已完成工作的百分比。在这里,我需要在执行查询时立即获取记录总数,并且在处理完每一行之后,我需要在标签中显示项目处理的当前索引,例如“处理 1/2000 个文档”。

实现上述功能的最佳方法是什么。我们正在使用 MVVM 模式。我是否需要更改我们在 BL 中获取和处理记录的方式(当前是 BL 方法中的 fectch 和处理(将值从数据读取器映射到自定义对象))。或者,当用户滚动数据网格时,我正在寻找以分页方式加载数据网格中的行。

任何样品链接表示赞赏。

编辑:@Big Daddy 您的解决方案 1)向视图模型添加新属性以获得 TotalCount 和 PercentComplete。2) 将视图模型传递给 Search 方法。3)使用BGW更新属性。

以上似乎是一个可行的解决方案。但我很想知道是否有任何其他方法可以在不依赖视图模型的情况下解决这个问题。任何可用于此类操作的设计模式?

4

2 回答 2

2

您可以使用 BackgroundWorker 来处理此问题。它不会在获取您的数据时阻止 UI,并且会保持 UI 响应用户。BackgroundWorker 有一个 ProgressChanged 事件,它与 ProgressBars 配合得非常好。

在我从事的项目中,我在客户端服务/存储库中实现了 BW。您的视图模型可以调用此类。这里的方法将实例化 BW、完成工作、报告进度并返回数据。您需要在 UI 上报告进度,因此在视图模型中设置一个属性并将 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
        };

如果您想了解更多详细信息,请告诉我。

于 2012-09-18T14:15:50.220 回答
1

所以你有所有的行。你指的是什么处理?渲染?渲染的显示状态将始终为 100%,因为它在完成渲染之前不会渲染。

UI 需要很长时间才能呈现 2000 行。有很多格式化和调整大小。

将 UI 分解为每页显示 40 行,并带有下一页和上一页按钮。

如果 DevExpress 数据网格不支持虚拟化,那么请寻找支持的网格。为了速度,我喜欢 ListView GridView。

哇支票。你在听。我给你更多。

因此,如果速度很快(并且您可以获得总计数),请立即获取整个 ID 列表。然后按需创建 40 个对象。如果您想花哨,请在 BackGroundWorker 上创建下一个 40。启动 BackGroundWorker 时禁用 Next 按钮并在 Complete 中启用它。

于 2012-09-18T13:45:21.863 回答