ReactiveUI подключен Наблюдаемый CanExecute со свойствами IsExecuting - PullRequest
0 голосов
/ 10 апреля 2020

Если выполняется CleanCommand, SearchCommand будет неактивен. Если SearchCommand выполняется, CleanCommand будет неактивен.

Штрих-код

public long Barcode
{
    get => _barcode;
    set => this.RaiseAndSetIfChanged(ref _barcode, value);
}

private readonly ObservableAsPropertyHelper<bool> _isSearching;
private readonly ObservableAsPropertyHelper<bool> _isCleaning;    
public bool IsSearching => _isSearching.Value;
public bool IsCleaning => _isCleaning.Value;
public ReactiveCommand<Unit, Unit> SearchCommand { get; }
public ReactiveCommand<Unit, Unit> CleanCommand { get; }

В конструкторе

SearchCommand = ReactiveCommand.CreateFromObservable(Search, SearchCanExecute());
SearchCommand.IsExecuting.ToProperty(this, x => x.IsSearching, out _isSearching);

CleanCommand = ReactiveCommand.CreateFromObservable(Clean, CleanCanExecute());
CleanCommand.IsExecuting.ToProperty(this, x => x.IsCleaning, out _isCleaning);

В классе

    IObservable<bool> SearchCanExecute()
    {
        bool isCleaningSuited = !IsCleaning;
        bool isBarcodeSuited = Barcode > 0;

        return Observable.Return(isBarcodeSuited);
    }

    IObservable<bool> CleanCanExecute()
    {
        bool isSearchingSuited = !IsSearching;

        return Observable.Return(isSearchingSuited);
    }

I получить статус процесса с помощью * IsExecuting.ToProperty ()

Я получаю значения со свойствами, такими как штрих-код.

Должен ли я использовать метод WhenAny * или я могу сделать это таким образом?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Я думаю, что решил проблему.

IObservable<bool> searchCommandObservable = this.WhenAnyObservable(x => x.SearchCommand.IsExecuting).StartWith(false).Select(x => x);
IObservable<bool> cleanCommandObservable = this.WhenAnyObservable(x => x.CleanCommand.IsExecuting).StartWith(false).Select(x => x);
IObservable<bool> barcodeObservable = this.WhenAnyValue(x => x.Barcode).StartWith(0).Select(x => x > 0);

IObservable<bool> searchCanExecute = Observable.Merge(
    searchCommandObservable.Select(x => !x),
    cleanCommandObservable.Select(x => !x),
    barcodeObservable
);

IObservable<bool> cleanCanExecute = Observable.Merge(
    searchCommandObservable.Select(x => !x),
    cleanCommandObservable.Select(x => !x)
);
0 голосов
/ 10 апреля 2020

Я бы, вероятно, сделал this.WhenAnyObservable при выполнении команды и передал ее в соответствующую команду canExecute. Таким образом, вам на самом деле не нужны функции, которые возвращают наблюдаемые, и это немного более плавно.

Что-то вроде следующего

            var commandOneCanExecute = this.WhenAnyObservable(x => x.CommandTwo.IsExecuting).StartWith(false).Select(x => !x);
            var commandTwoCanExecute = this.WhenAnyObservable(x => x.CommandOne.IsExecuting).StartWith(false).Select(x => !x);
            CommandOne = ReactiveCommand.CreateFromObservable(ExecuteCommand, commandOneCanExecute);
            CommandTwo = ReactiveCommand.CreateFromObservable(ExecuteCommand, commandTwoCanExecute);
...