ReactiveUI подключил Observable CanExecute со свойствами IsExecuting

Если 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);
    }

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

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

Стоит ли использовать метод WhenAny* или можно так?

2 ответа

Я бы, наверное, сделал 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);

Думаю, я решил проблему.

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)
);
Другие вопросы по тегам