MVVM进度条,用于长后端请求

时间:2019-03-04 15:44:04

标签: c# wpf mvvm

我有一个带有数据表和大量记录的WPF / MVVM应用程序。用户可以根据需要选择尽可能多的记录  更新所有记录的一个或多个属性。如果用户单击更新按钮,我的后端将处理更改并更新   数据库中的所有记录。但是,每个更改都需要发送到其他一些系统。更新查询本身不会花费很长时间,    对其他系统的更改需要更多时间。

因此,假设用户选择了2000行进行更新。用户大部分时间都不熟练,甚至只等待3秒钟也不愿意等待。   我所做的是以下事情:

if(totalSelectedRows > 1000) { SplitUpdateRequest(); }
else { Update(selectedRows); }

我基本上是说,如果选择的行数超过1000,则update命令将分成多个更新命令,每行100行。   因此,对于2000行,我同步调用update方法20次。每次通话后,我都会知道更新是否成功。   我用这些知识来显示进度条。   之所以这样做,是因为我现在有些用户只会关闭应用程序,然后一次又一次地尝试,结果后端必须处理很多传入请求。   这一切似乎都能按预期工作,但我确实相信必须有另一种解决方案/方式来处理或显示一些进度,以便用户知道正在发生的事情。有什么建议以其他方式做到这一点吗?   我无法在后端进行任何更改。

在我的代码下面:

    Viewmodel:

    private AsyncRelayCommand updateCommand;
    public ICommand UpdateCommand
    {
        get
        {
            return updateCommand ?? (updateCommand = new AsyncRelayCommand(Update));
        }
    }

    private async Task Testing() => await Task.Run(() =>
    {
        // If more than 1000 records, then the request will be seperated into multiple synchronous update commands
        if (selectedRecords?.Count() > 1000)
        {
            TotalRequests = (int)Math.Ceiling((double)selectedRecords.Count() / 1000);
            CurrentRequest = 0;
            ProgressPercentage = 0;
            for (int i = 0; i < TotalRequests; i++)
            {
                _service.update(selectedRecords);
                CurrentRequest++;
                ProgressPercentage = (int)(((double)CurrentRequest / (double)TotalRequests) * 100);
            }
        }
        else
            _service.update(selectedRecords);
    });

    View:

    <ProgressBar Minimum="0" Maximum="100" Value="{Binding ProgressPercentage, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
    <TextBlock Text="{Binding ProgressPercentage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat={}{0:0}%}"/>

0 个答案:

没有答案