C# 如何在ReactiveUI中的ReactiveCommand中为canExecute分配函数?
我最近开始学习被动扩展,而不是Rx方面的专家。但是,我正在将以前编写的应用程序更改为反应式UI。但是,当我想将RelayCommand更改为ReactiveCommand时,我遇到了以下错误: System.NotSupportedException:“索引表达式仅受常量支持。 我的RelayCommand定义如下:C# 如何在ReactiveUI中的ReactiveCommand中为canExecute分配函数?,c#,wpf,mvvm,system.reactive,reactiveui,C#,Wpf,Mvvm,System.reactive,Reactiveui,我最近开始学习被动扩展,而不是Rx方面的专家。但是,我正在将以前编写的应用程序更改为反应式UI。但是,当我想将RelayCommand更改为ReactiveCommand时,我遇到了以下错误: System.NotSupportedException:“索引表达式仅受常量支持。 我的RelayCommand定义如下: DownloadCmd = new RelayCommand(async x=> await DownloadSubtitle(), CheckYoutubeLink);
DownloadCmd = new RelayCommand(async x=> await DownloadSubtitle(), CheckYoutubeLink);
我用一个反应式命令更改了它,如下所示:
var can = this.WhenAnyObservable(x=>Observable.Return(x.CheckYoutubeLink()));
DownloadCmd = ReactiveCommand.CreateFromTask(_ => DownloadSubtitle(),can);
不幸的是,它不起作用。换句话说,我的问题是如何将函数(Func)用于“canExecute”参数或类似函数的行为。顺便说一下,我不喜欢使用属性而不是函数,因为我必须为命令编写许多属性。
我已检查此链接:
但是,这对我没有多大帮助。基于我在评论中所做的假设,解决方案可能如下所示:
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");
}
公共视图模型()
{
这
.WhenyValue(x=>x.CurrentLink)
.Subscribe(=>CheckYoutubeLink());
var can=这个
.whenyValue(x=>x.IsLinkValid);
DownloadCmd=ReactiveCommand.CreateFromTask(=>DownloadSubtitle(),can);
}
public ICommand DownloadCmd{get;private set;}
[反应性]
公共字符串CurrentLink{get;set;}
[反应性]
公共bool IsLinkValid{get;set;}
私人任务下载字幕()
{
//你的逻辑在这里
}
私人作废支票YouTubeLink()
{
//你的逻辑在这里
IsLinkValid=CurrentLink!=null&&CurrentLink.Contains(“youtube”);
}
正如我所说,我不知道你的应用程序是什么样子的,但只要在设置链接时调用CheckYoutubeLink即可。基于我在评论中所做的假设,解决方案可能如下所示:
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");
}
公共视图模型()
{
这
.WhenyValue(x=>x.CurrentLink)
.Subscribe(=>CheckYoutubeLink());
var can=这个
.whenyValue(x=>x.IsLinkValid);
DownloadCmd=ReactiveCommand.CreateFromTask(=>DownloadSubtitle(),can);
}
public ICommand DownloadCmd{get;private set;}
[反应性]
公共字符串CurrentLink{get;set;}
[反应性]
公共bool IsLinkValid{get;set;}
私人任务下载字幕()
{
//你的逻辑在这里
}
私人作废支票YouTubeLink()
{
//你的逻辑在这里
IsLinkValid=CurrentLink!=null&&CurrentLink.Contains(“youtube”);
}
正如我所说,我不知道你的应用程序是什么样子的,但你只要在设置链接时调用CheckYoutubeLink即可。请提供更多代码,CheckYoutubeLink方法是什么样子的,你有什么返回类型?DownloadSubtitle有什么声明?@icn:ReactiveUI实现显然取决于当前如何实现
CheckYoutubeLink
,以及如何以及何时提出RelayCommand
的CanExecuteChanged
方法?“Observable.Return(x.CheckYoutubeLink())将只检查一次链接,将结果导入可观察对象,然后完成。我同意wit Hostel和mm8要求提供更多信息,但我猜在您的应用程序中有类似的链接属性可以更改。因此,您需要创建一个像“IsLinkValid”这样的被动属性,而不是您的check方法,并在链接更改时更新它。在这个属性上,您可以使用WhenAnyValue构建一个可观察的值,这个值可以用于“can”。@Hostel,Đøharrrck正确地预测了我的代码,他的答案是“CheckYoutubeLink()”接近我的实现。请提供更多代码,CheckYoutubeLink方法看起来如何,您有什么返回类型?DownloadSubtitle有什么声明?@icn:ReactiveUI实现显然取决于当前如何实现CheckYoutubeLink
,以及如何以及何时提出RelayCommand
的CanExecuteChanged
方法?“Observable.Return(x.CheckYoutubeLink())将只检查一次链接,将结果导入可观察对象,然后完成。我同意wit Hostel和mm8要求提供更多信息,但我猜在您的应用程序中有类似的链接属性可以更改。因此,您需要创建一个像“IsLinkValid”这样的被动属性,而不是您的check方法,并在链接更改时更新它。在这个属性上,您可以使用您可以用于“can”的任何值来构建一个可观察的值。@Hostel,Đøharrrck正确地预测了我的代码,他的答案是关于“CheckYoutubeLink()”接近我的实现。谢谢。这是正确的方法。正如我之前所说,我是RX和ReactiveUI的新手,头脑中有很多误解。事实上,我不知道ReactiveUI是如何工作的,以及observables和observables在哪里使用和部署。谢谢。这是正确的方法。正如我之前所说,我是RX和ReactiveUI的新手,头脑中有很多误解。事实上,我不知道ReactiveUI是如何工作的,也不知道observables和observables在哪里使用和部署。