Индикатор выполнения обновляется только после завершения метода

Я изо всех сил пытаюсь заставить что-то работать и надеюсь, что кто-то укажет мне правильное направление. У меня есть 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, не обновляется до тех пор, пока команда не будет завершена - немного побеждает суть! Кто-нибудь может пролить свет?

0 ответов

Другие вопросы по тегам