Индикатор выполнения обновляется только после завершения метода
Я изо всех сил пытаюсь заставить что-то работать и надеюсь, что кто-то укажет мне правильное направление. У меня есть ReactiveCommand, который вызывается кнопкой в окне AvaloniaUI, которое выполняет некоторую обработку на некоторых листах Excel.
Вид
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ProgressReporting.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="ProgressReporting.Views.MainWindow"
Icon="/Assets/avalonia-logo.ico"
Title="ProgressReporting">
<Design.DataContext>
<vm:MainWindowViewModel/>
</Design.DataContext>
<StackPanel>
<ProgressBar Value="{Binding ProgressIncrement}" Margin="10"></ProgressBar>
<Button Command="{Binding ProcessPerDiemsCommand}">Process</Button>
</StackPanel>
</Window>
ВМ
using ProgressReporting.Models;
using ReactiveUI;
using System;
using System.Reactive;
using System.Threading;
using System.Threading.Tasks;
namespace ProgressReporting.ViewModels
{
public class MainWindowViewModel : ViewModelBase
{
public MainWindowViewModel()
{
Progress<ProgressReportModel> progress = new Progress<ProgressReportModel>();
progress.ProgressChanged += OnProgressChanged;
ProcessPerDiemsCommand = ReactiveCommand.CreateFromTask(() => ProcessPerDiemsAsync(progress));
}
private void OnProgressChanged(object? sender, ProgressReportModel e)
{
ProgressIncrement = (e.Progress * 100) / e.ProgressMax;
ProgressText = e.CurrentStage;
}
private double _progressIncrement;
public double ProgressIncrement
{
get { return _progressIncrement; }
set => this.RaiseAndSetIfChanged(ref _progressIncrement, value);
}
private string _progressText;
public string ProgressText
{
get { return _progressText; }
set => this.RaiseAndSetIfChanged(ref _progressText, value);
}
public ReactiveCommand<Unit, Unit> ProcessPerDiemsCommand { get; }
private async Task ProcessPerDiemsAsync(IProgress<ProgressReportModel> progress)
{
var report = new ProgressReportModel();
report.CurrentStage = "Executing";
report.ProgressMax = 100;
for (int i = 0; i<=100; i++)
{
Thread.Sleep(100);
report.Progress = i;
progress.Report(report);
}
report.CurrentStage = "Completed";
progress.Report(report);
}
}
}
ProgressReportModel
namespace ProgressReporting.Models
{
public class ProgressReportModel
{
public double ProgressMax { get; set; }
public double Progress { get; set; }
public string CurrentStage { get; set; } = "";
}
}
Код работает нормально - проблема в том, что обработчик событий OnProgressChanged вызывается только после завершения работы ReactiveCommand, и поэтому мой индикатор выполнения, привязанный к ProgressIncrement, не обновляется до тех пор, пока команда не будет завершена - немного побеждает суть! Кто-нибудь может пролить свет?