【问题标题】:ReactiveUI connected Observable CanExecute with IsExecuting propertiesReactiveUI 连接 Observable CanExecute 和 IsExecuting 属性
【发布时间】:2020-04-09 21:04:23
【问题描述】:

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

【问题讨论】:

    标签: c# reactive reactiveui avaloniaui avalonia


    【解决方案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);
    

    【讨论】:

    • @echoman 这不应该被标记为答案吗? ;)
    【解决方案2】:

    我想我解决了这个问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多