根据是不是选择了 Xamarin CollectionView 项来确定 ReactiveUI 中的 CanExecute

Posted

技术标签:

【中文标题】根据是不是选择了 Xamarin CollectionView 项来确定 ReactiveUI 中的 CanExecute【英文标题】:Determining CanExecute in ReactiveUI based upon whether a Xamarin CollectionView item is selected根据是否选择了 Xamarin CollectionView 项来确定 ReactiveUI 中的 CanExecute 【发布时间】:2021-08-20 23:55:16 【问题描述】:

我有一个设置为 SelectionMode="Single" 并将 SelectedItem 绑定到 ViewModel 属性的项目的 Xamarin Forms CollectionView。

ViewModel 属性如下所示:

private TaskItem _selectedTask;

    public TaskItem SelectedTask
    
        get => _selectedTask;
        set => this.RaiseAndSetIfChanged(ref _selectedTask, value);
    

我还有一个绑定到 ReactiveCommand 的按钮,我想添加一个 CanExecute 参数。

当应用第一次启动时,ViewModel 的 SelectedTask 属性为 null,因为 CollectionView 中没有任何项目被选中。所以我希望我的 CanExecute 只有在选择了一个项目时才返回 true。这意味着 SelectedTask 将不再为空。但我不知道如何测试整个对象是否为空而不是对象的属性。换句话说,我想做这样的事情:

IObservable<bool> DeleteTaskCanExecute()
            
    return this.WhenAnyValue(x => x.SelectedTask,
        selectedTask => selectedTask != null                    
      );

但我不能,因为它有一个错误,即 WhenAnyValue 调用在两个签名之间不明确,因为它希望我基于 TaskItem 属性而不是 SelectedTask 表示的 TaskItem 对象来制作表达式。

因此,我认为 WhenAnyValue 不是合适的函数,但我无法找到我要使用的函数。

如何创建一个 CanExecute 函数,该函数将与 ReactiveUI 命令一起使用,并且仅在选择了 CollectionView 中的某些内容时才返回 true?

【问题讨论】:

this.WhenAnyValue(x =&gt; x.SelectedTask).WhereNotNull() 我实际上已经尝试过使用 WhereNotNull(),但它返回一个 IObservable 而 CanExecute 需要一个 IObservable 【参考方案1】:
IObservable<bool> DeleteTaskCanExecute()
            
    return this
        .WhenAnyValue(x => x.SelectedTask)
        .Select(x => x != null);

【讨论】:

以上是关于根据是不是选择了 Xamarin CollectionView 项来确定 ReactiveUI 中的 CanExecute的主要内容,如果未能解决你的问题,请参考以下文章

什么时候该选用Xamarin?

Xamarin Forms 在 UWP 上是不是存在内存泄漏?

Visual Studio 中的 xamarin 是不是在 xamarin.form 中提供拖放功能?

Xamarin Studio 是不是应该在为调试目标编译时生成 APK?

运行 Xamarin.UITests 时有没有办法让应用程序选择语言或文化

C#用xamarin for VS开发安卓APP,应该学哪些基础的知识