问题描述
我最近开始学习反应式扩展,而不是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。