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)
);