Задержка отображения элемента управления пользовательского интерфейса после выполнения ReactiveCommand - PullRequest
0 голосов
/ 04 июля 2018

У меня есть реактивная команда readCommand, которую я выполняю на основе сигнала.

IObservable<Unit> readSignal = ...

readSignal.InvokeCommand(readCommand);

Результат команды отображается в пользовательском элементе управления, скажем, TextBox.

Я хотел бы поместить refresh button рядом с TextBox, который при нажатии вызывает readCommand. Эта кнопка не должна быть видна во время выполнения команды, а затем сделана видимой через 5 секунд после выполнения команды.

Моя попытка отобразить / скрыть refresh button следует. IsRefreshable связан со свойством Visibility refresh button.

readCommand
    .IsExecuting
    .SelectMany(x => (x ? Observable.Timer(TimeSpan.FromMilliseconds(0)) : Observable.Timer(refreshTimeout)).Select(_ => !x))
    .ToPropertyEx(this, vm => vm.IsRefreshable, false, false, RxApp.MainThreadScheduler);

Я думаю, что работает нормально, когда скорость выброса readSignal ниже, чем скорость обновления (refreshTimeout). Но явно не работает, если скорость readSignal выше refreshTimeout.

1 Ответ

0 голосов
/ 05 июля 2018

С SelectMany вы превращаете IObservable<IObservable<T>> в IObservable<T>, объединяя все внутренние наблюдаемые - это означает, что все таймеры сработают, приводя к нежелательному поведению.

A SelectMany фактически совпадает с комбо Select / Merge.

Что вам нужно, так это просто получить значения из последних произведенных внутренних наблюдаемых. Для этого вам необходим комбо Select / Switch.

Попробуйте это:

readCommand
    .IsExecuting
    .Select(x => x
        ? Observable.Timer(TimeSpan.FromMilliseconds(0))
        : Observable.Timer(refreshTimeout).Select(_ => !x))
    .Switch()
    .ToPropertyEx(this, vm => vm.IsRefreshable, false, false, RxApp.MainThreadScheduler);
...