如何在ReactiveUI的ReactiveCommand中为canExecute分配功能?

问题描述

我最近开始学习反应式扩展,而不是Rx专家。但是,我正在将以前编写的应用程序更改为Reactive UI。但是,当我想将RelayCommand更改为ReactiveCommand 时,我遇到了此错误

System.NotSupportedException:'索引表达式仅受常量支持 我的RelayCommand定义如下:

DownloadCmd = new RelayCommand(async x=> await DownloadSubtitle(),CheckYoutubeLink);

我通过反应式命令对其进行了如下更改:

var can = this.WhenAnyObservable(x=>Observable.Return(x.CheckYoutubeLink()));
DownloadCmd = ReactiveCommand.CreateFromTask(_ => DownloadSubtitle(),can);

不幸的是,它不起作用。换句话说,我的问题是如何对“ canExecute”参数或行为类似于函数函数使用函数(Func)。顺便说一句,我不喜欢使用属性而不是函数,因为我必须为命令编写许多属性。 我检查了此链接ReactiveUI: Using CanExecute with a ReactiveCommand,但是对我没有太大帮助。

解决方法

基于我在评论中所做的假设,一个解决方案可能看起来像这样:

    public ViewModel()
    {
        this
            .WhenAnyValue(x => x.CurrentLink)
            .Subscribe(_ => CheckYoutubeLink());

        var can = this
            .WhenAnyValue(x => x.IsLinkValid);

        DownloadCmd = ReactiveCommand.CreateFromTask(_ => DownloadSubtitle(),can);
    }


    public ICommand DownloadCmd { get; private set; }

    [Reactive]
    public string CurrentLink { get; set; }

    [Reactive]
    public bool IsLinkValid { get; set; }

    private Task<object> DownloadSubtitle()
    {
        // your logic here
    }

    private void CheckYoutubeLink()
    {
        // your logic here
        IsLinkValid = CurrentLink != null && CurrentLink.Contains("youtube");
    }

正如我所说,我不知道您的应用程序是什么样子,但是只要设置链接,您就必须调用CheckYoutubeLink。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...