0

如果 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* 方法还是可以这样做?

4

2 回答 2

1

我可能会执行this.WhenAnyObservable命令并将其通过管道传输到相应的命令canExecute中。这样你就不需要返回 observables 的函数,而且它更流畅一些。

类似于以下内容

            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);
于 2020-04-10T02:17:57.103 回答
0

我想我解决了这个问题。

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)
);
于 2020-04-10T07:15:30.640 回答