C# 如何在ReactiveUI中的ReactiveCommand中为canExecute分配函数?

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

我最近开始学习被动扩展,而不是Rx方面的专家。但是,我正在将以前编写的应用程序更改为反应式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);
不幸的是,它不起作用。换句话说,我的问题是如何将函数(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在哪里使用和部署。